From 44f8a4fbaaa5cb79096cd4c8d647616dca92a42c Mon Sep 17 00:00:00 2001 From: Valentin Petrovych Date: Mon, 21 Mar 2022 15:23:19 +0200 Subject: [PATCH] feat(unification): connect BidLoader from rendering #370 Add Native json object. Add saving Native ad to cache. --- .../main/java/org/prebid/mobile/AdUnit.java | 76 +++++++++---- .../java/org/prebid/mobile/BannerAdUnit.java | 3 +- .../org/prebid/mobile/BannerBaseAdUnit.java | 3 +- .../org/prebid/mobile/InterstitialAdUnit.java | 3 +- .../java/org/prebid/mobile/NativeAdUnit.java | 31 +++++- .../java/org/prebid/mobile/NativeAsset.java | 7 +- .../org/prebid/mobile/NativeDataAsset.java | 22 ++++ .../org/prebid/mobile/NativeImageAsset.java | 43 +++++++- .../org/prebid/mobile/NativeTitleAsset.java | 23 ++++ .../prebid/mobile/RewardedVideoAdUnit.java | 3 +- .../src/main/java/org/prebid/mobile/Util.java | 3 +- .../java/org/prebid/mobile/VideoAdUnit.java | 3 +- .../org/prebid/mobile/VideoBaseAdUnit.java | 3 +- .../mobile/VideoInterstitialAdUnit.java | 3 +- .../rendering/bidding/data/bid/Bid.java | 8 ++ .../bidding/data/bid/BidResponse.java | 8 ++ .../bidding/display/BidResponseCache.java | 4 +- .../models/openrtb/bidRequests/Imp.java | 9 ++ .../models/openrtb/bidRequests/Native.java | 101 ++++++++++++++++++ .../parameters/BasicParameterBuilder.java | 10 +- .../configuration/AdUnitConfiguration.java | 6 +- .../NativeAdUnitConfiguration.java | 3 +- 22 files changed, 327 insertions(+), 48 deletions(-) create mode 100644 PrebidMobile/PrebidMobile-core/src/main/java/org/prebid/mobile/rendering/models/openrtb/bidRequests/Native.java diff --git a/PrebidMobile/PrebidMobile-core/src/main/java/org/prebid/mobile/AdUnit.java b/PrebidMobile/PrebidMobile-core/src/main/java/org/prebid/mobile/AdUnit.java index e3c83201b..7012ed445 100644 --- a/PrebidMobile/PrebidMobile-core/src/main/java/org/prebid/mobile/AdUnit.java +++ b/PrebidMobile/PrebidMobile-core/src/main/java/org/prebid/mobile/AdUnit.java @@ -23,7 +23,12 @@ import android.text.TextUtils; import androidx.annotation.IntRange; import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import androidx.annotation.VisibleForTesting; +import org.prebid.mobile.rendering.bidding.data.bid.BidResponse; +import org.prebid.mobile.rendering.bidding.listeners.BidRequesterListener; +import org.prebid.mobile.rendering.bidding.loader.BidLoader; +import org.prebid.mobile.rendering.errors.AdException; import org.prebid.mobile.tasksmanager.TasksManager; import org.prebid.mobile.units.configuration.AdUnitConfiguration; @@ -37,9 +42,12 @@ public abstract class AdUnit { private DemandFetcher fetcher; protected AdUnitConfiguration configuration = new AdUnitConfiguration(); - AdUnit(@NonNull String configId, @NonNull AdType adType) { + @Nullable + protected Object adObject; + + AdUnit(@NonNull String configId, @NonNull AdUnitConfiguration.AdUnitIdentifierType adType) { configuration.setConfigId(configId); - configuration.setAdType(adType); + configuration.setAdUnitIdentifierType(adType); } public void setAutoRefreshPeriodMillis(@IntRange(from = MIN_AUTO_REFRESH_PERIOD_MILLIS) int periodMillis) { @@ -68,19 +76,12 @@ public void stopAutoRefresh() { } public void fetchDemand(@NonNull final OnCompleteListener2 listener) { - final Map keywordsMap = new HashMap<>(); - fetchDemand(keywordsMap, new OnCompleteListener() { - @Override - public void onComplete(final ResultCode resultCode) { - TasksManager.getInstance().executeOnMainThread(new Runnable() { - @Override - public void run() { - listener.onComplete(resultCode, keywordsMap.size() != 0 ? Collections.unmodifiableMap(keywordsMap) : null); - } - }); - } + fetchDemand(keywordsMap, resultCode -> { + TasksManager.getInstance().executeOnMainThread(() -> + listener.onComplete(resultCode, keywordsMap.size() != 0 ? Collections.unmodifiableMap(keywordsMap) : null) + ); }); } @@ -130,17 +131,26 @@ public void fetchDemand(@NonNull Object adObj, @NonNull OnCompleteListener liste } if (Util.supportedAdObject(adObj)) { - fetcher = new DemandFetcher(adObj); - fetcher.setPeriodMillis(periodMillis); - fetcher.setConfiguration(configuration); - fetcher.setListener(listener); - if (periodMillis >= 30000) { - LogUtil.v("Start fetching bids with auto refresh millis: " + periodMillis); - } else { - LogUtil.v("Start a single fetching."); - } - fetcher.start(); + adObject = adObj; + BidLoader loader = new BidLoader( + context, + configuration, + createBidListener(listener) + ); + loader.load(); + // TODO:Unification: Add auto refresh +// fetcher = new DemandFetcher(adObj); +// fetcher.setPeriodMillis(periodMillis); +// fetcher.setConfiguration(configuration); +// fetcher.setListener(listener); +// if (periodMillis >= 30000) { +// LogUtil.v("Start fetching bids with auto refresh millis: " + periodMillis); +// } else { +// LogUtil.v("Start a single fetching."); +// } +// fetcher.start(); } else { + adObject = null; listener.onComplete(ResultCode.INVALID_AD_OBJECT); } @@ -249,6 +259,26 @@ public void setPbAdSlot(String pbAdSlot) { configuration.setPbAdSlot(pbAdSlot); } + + protected BidRequesterListener createBidListener(OnCompleteListener originalListener) { + return new BidRequesterListener() { + @Override + public void onFetchCompleted(BidResponse response) { + HashMap keywords = response.getTargeting(); + Util.apply(keywords, adObject); + originalListener.onComplete(ResultCode.SUCCESS); + } + + @Override + public void onError(AdException exception) { + Util.apply(null, adObject); + // TODO:Unification: Change code + originalListener.onComplete(ResultCode.NETWORK_ERROR); + } + }; + } + + @VisibleForTesting public AdUnitConfiguration getConfiguration() { return configuration; diff --git a/PrebidMobile/PrebidMobile-core/src/main/java/org/prebid/mobile/BannerAdUnit.java b/PrebidMobile/PrebidMobile-core/src/main/java/org/prebid/mobile/BannerAdUnit.java index 819e800ab..1f7f3a592 100644 --- a/PrebidMobile/PrebidMobile-core/src/main/java/org/prebid/mobile/BannerAdUnit.java +++ b/PrebidMobile/PrebidMobile-core/src/main/java/org/prebid/mobile/BannerAdUnit.java @@ -17,13 +17,14 @@ package org.prebid.mobile; import androidx.annotation.NonNull; +import org.prebid.mobile.units.configuration.AdUnitConfiguration; import java.util.HashSet; public class BannerAdUnit extends BannerBaseAdUnit { public BannerAdUnit(@NonNull String configId, int width, int height) { - super(configId, AdType.BANNER); + super(configId, AdUnitConfiguration.AdUnitIdentifierType.BANNER); configuration.addSize(new AdSize(width, height)); } diff --git a/PrebidMobile/PrebidMobile-core/src/main/java/org/prebid/mobile/BannerBaseAdUnit.java b/PrebidMobile/PrebidMobile-core/src/main/java/org/prebid/mobile/BannerBaseAdUnit.java index 2c1cf544d..b5889efd2 100644 --- a/PrebidMobile/PrebidMobile-core/src/main/java/org/prebid/mobile/BannerBaseAdUnit.java +++ b/PrebidMobile/PrebidMobile-core/src/main/java/org/prebid/mobile/BannerBaseAdUnit.java @@ -18,12 +18,13 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; +import org.prebid.mobile.units.configuration.AdUnitConfiguration; import java.util.List; public abstract class BannerBaseAdUnit extends AdUnit { - BannerBaseAdUnit(@NonNull String configId, @NonNull AdType adType) { + BannerBaseAdUnit(@NonNull String configId, @NonNull AdUnitConfiguration.AdUnitIdentifierType adType) { super(configId, adType); } diff --git a/PrebidMobile/PrebidMobile-core/src/main/java/org/prebid/mobile/InterstitialAdUnit.java b/PrebidMobile/PrebidMobile-core/src/main/java/org/prebid/mobile/InterstitialAdUnit.java index 1763f06fc..64778a2c3 100644 --- a/PrebidMobile/PrebidMobile-core/src/main/java/org/prebid/mobile/InterstitialAdUnit.java +++ b/PrebidMobile/PrebidMobile-core/src/main/java/org/prebid/mobile/InterstitialAdUnit.java @@ -18,11 +18,12 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; +import org.prebid.mobile.units.configuration.AdUnitConfiguration; public class InterstitialAdUnit extends BannerBaseAdUnit { public InterstitialAdUnit(@NonNull String configId) { - super(configId, AdType.INTERSTITIAL); + super(configId, AdUnitConfiguration.AdUnitIdentifierType.INTERSTITIAL); } public InterstitialAdUnit(@NonNull String configId, int minWidthPerc, int minHeightPerc) { diff --git a/PrebidMobile/PrebidMobile-core/src/main/java/org/prebid/mobile/NativeAdUnit.java b/PrebidMobile/PrebidMobile-core/src/main/java/org/prebid/mobile/NativeAdUnit.java index fb6613ff6..209a9b2ff 100644 --- a/PrebidMobile/PrebidMobile-core/src/main/java/org/prebid/mobile/NativeAdUnit.java +++ b/PrebidMobile/PrebidMobile-core/src/main/java/org/prebid/mobile/NativeAdUnit.java @@ -3,8 +3,14 @@ import androidx.annotation.NonNull; import androidx.annotation.VisibleForTesting; import org.json.JSONObject; +import org.prebid.mobile.rendering.bidding.data.bid.BidResponse; +import org.prebid.mobile.rendering.bidding.listeners.BidRequesterListener; +import org.prebid.mobile.rendering.errors.AdException; +import org.prebid.mobile.units.configuration.AdUnitConfiguration; import org.prebid.mobile.units.configuration.NativeAdUnitConfiguration; +import java.util.HashMap; + /** * For details of the configuration of native imps, please check this documentation: * https://www.iab.com/wp-content/uploads/2018/03/OpenRTB-Native-Ads-Specification-Final-1.2.pdf @@ -16,11 +22,34 @@ public class NativeAdUnit extends AdUnit { private final NativeAdUnitConfiguration nativeConfiguration; public NativeAdUnit(@NonNull String configId) { - super(configId, AdType.NATIVE); + super(configId, AdUnitConfiguration.AdUnitIdentifierType.NATIVE); configuration.initNativeConfiguration(); nativeConfiguration = configuration.getNativeConfiguration(); } + @Override + protected BidRequesterListener createBidListener(OnCompleteListener originalListener) { + return new BidRequesterListener() { + @Override + public void onFetchCompleted(BidResponse response) { + HashMap keywords = response.getTargeting(); + Util.apply(keywords, adObject); + + String cacheId = CacheManager.save(response.getWinningBidJson()); + Util.saveCacheId(cacheId, adObject); + + originalListener.onComplete(ResultCode.SUCCESS); + } + + @Override + public void onError(AdException exception) { + Util.apply(null, adObject); + // TODO:Unification: Change code + originalListener.onComplete(ResultCode.NETWORK_ERROR); + } + }; + } + public enum CONTEXT_TYPE { CONTENT_CENTRIC(1), SOCIAL_CENTRIC(2), diff --git a/PrebidMobile/PrebidMobile-core/src/main/java/org/prebid/mobile/NativeAsset.java b/PrebidMobile/PrebidMobile-core/src/main/java/org/prebid/mobile/NativeAsset.java index 775191106..227151f93 100644 --- a/PrebidMobile/PrebidMobile-core/src/main/java/org/prebid/mobile/NativeAsset.java +++ b/PrebidMobile/PrebidMobile-core/src/main/java/org/prebid/mobile/NativeAsset.java @@ -1,6 +1,9 @@ package org.prebid.mobile; +import org.json.JSONObject; + public abstract class NativeAsset { + enum REQUEST_ASSET { TITLE, IMAGE, @@ -17,8 +20,6 @@ public REQUEST_ASSET getType() { return type; } - - - + public abstract JSONObject getJsonObject(); } diff --git a/PrebidMobile/PrebidMobile-core/src/main/java/org/prebid/mobile/NativeDataAsset.java b/PrebidMobile/PrebidMobile-core/src/main/java/org/prebid/mobile/NativeDataAsset.java index c810877fb..2db5ef5b4 100644 --- a/PrebidMobile/PrebidMobile-core/src/main/java/org/prebid/mobile/NativeDataAsset.java +++ b/PrebidMobile/PrebidMobile-core/src/main/java/org/prebid/mobile/NativeDataAsset.java @@ -2,6 +2,7 @@ import org.json.JSONArray; import org.json.JSONObject; +import org.prebid.mobile.rendering.utils.logger.LogUtil; public class NativeDataAsset extends NativeAsset { public NativeDataAsset() { @@ -101,4 +102,25 @@ public void setAssetExt(Object assetExt) { this.assetExt = assetExt; } } + + @Override + public JSONObject getJsonObject() { + JSONObject result = new JSONObject(); + + try { + result.putOpt("required", required ? 1 : 0); + result.putOpt("ext", assetExt); + + JSONObject dataObject = new JSONObject(); + dataObject.putOpt("type", dataType != null ? dataType.getID() : null); + dataObject.putOpt("len", len); + dataObject.putOpt("ext", dataExt); + + result.put("data", dataObject); + } catch (Exception exception) { + LogUtil.error("NativeTitleAsset", "Can't create json object: " + exception.getMessage()); + } + + return result; + } } diff --git a/PrebidMobile/PrebidMobile-core/src/main/java/org/prebid/mobile/NativeImageAsset.java b/PrebidMobile/PrebidMobile-core/src/main/java/org/prebid/mobile/NativeImageAsset.java index 4973d1718..361c8ced6 100644 --- a/PrebidMobile/PrebidMobile-core/src/main/java/org/prebid/mobile/NativeImageAsset.java +++ b/PrebidMobile/PrebidMobile-core/src/main/java/org/prebid/mobile/NativeImageAsset.java @@ -2,6 +2,7 @@ import org.json.JSONArray; import org.json.JSONObject; +import org.prebid.mobile.rendering.utils.logger.LogUtil; import java.util.ArrayList; @@ -52,7 +53,7 @@ public IMAGE_TYPE getImageType() { return type; } - private int wmin = -1; + private int wmin = 0; public void setWMin(int wmin) { this.wmin = wmin; @@ -62,7 +63,7 @@ public int getWMin() { return wmin; } - private int hmin = -1; + private int hmin = 0; public int getHMin() { return hmin; @@ -72,7 +73,7 @@ public void setHMin(int hmin) { this.hmin = hmin; } - private int w = -1; + private int w = 0; public int getW() { return w; @@ -82,7 +83,7 @@ public void setW(int w) { this.w = w; } - private int h = -1; + private int h = 0; public void setH(int h) { this.h = h; @@ -135,4 +136,38 @@ public void setImageExt(Object imageExt) { public Object getImageExt() { return imageExt; } + + + @Override + public JSONObject getJsonObject() { + JSONObject result = new JSONObject(); + + try { + result.putOpt("required", required ? 1 : 0); + result.putOpt("ext", assetExt); + + JSONObject imageObject = new JSONObject(); + imageObject.putOpt("type", type != null ? type.getID() : null); + + imageObject.put("w", w); + imageObject.put("wmin", wmin); + imageObject.put("h", h); + imageObject.put("hmin", hmin); + imageObject.putOpt("ext", imageExt); + + if (!mimes.isEmpty()) { + JSONArray mimesArray = new JSONArray(); + for (String mime : mimes) { + mimesArray.put(mime); + } + imageObject.putOpt("mimes", mimesArray); + } + + result.put("img", imageObject); + } catch (Exception exception) { + LogUtil.error("NativeImageAsset", "Can't create json object: " + exception.getMessage()); + } + + return result; + } } diff --git a/PrebidMobile/PrebidMobile-core/src/main/java/org/prebid/mobile/NativeTitleAsset.java b/PrebidMobile/PrebidMobile-core/src/main/java/org/prebid/mobile/NativeTitleAsset.java index 297d6207c..e53957e7d 100644 --- a/PrebidMobile/PrebidMobile-core/src/main/java/org/prebid/mobile/NativeTitleAsset.java +++ b/PrebidMobile/PrebidMobile-core/src/main/java/org/prebid/mobile/NativeTitleAsset.java @@ -2,8 +2,10 @@ import org.json.JSONArray; import org.json.JSONObject; +import org.prebid.mobile.rendering.utils.logger.LogUtil; public class NativeTitleAsset extends NativeAsset { + private int len; private boolean required; private Object titleExt; @@ -48,4 +50,25 @@ public void setAssetExt(Object assetExt) { this.assetExt = assetExt; } } + + @Override + public JSONObject getJsonObject() { + JSONObject result = new JSONObject(); + + try { + result.putOpt("required", required ? 1 : 0); + result.putOpt("ext", assetExt); + + JSONObject titleObject = new JSONObject(); + titleObject.putOpt("len", len); + titleObject.putOpt("ext", titleExt); + + result.put("title", titleObject); + } catch (Exception exception) { + LogUtil.error("NativeTitleAsset", "Can't create json object: " + exception.getMessage()); + } + + return result; + } + } diff --git a/PrebidMobile/PrebidMobile-core/src/main/java/org/prebid/mobile/RewardedVideoAdUnit.java b/PrebidMobile/PrebidMobile-core/src/main/java/org/prebid/mobile/RewardedVideoAdUnit.java index 7b94bcb5e..5198d46e7 100644 --- a/PrebidMobile/PrebidMobile-core/src/main/java/org/prebid/mobile/RewardedVideoAdUnit.java +++ b/PrebidMobile/PrebidMobile-core/src/main/java/org/prebid/mobile/RewardedVideoAdUnit.java @@ -17,11 +17,12 @@ package org.prebid.mobile; import androidx.annotation.NonNull; +import org.prebid.mobile.units.configuration.AdUnitConfiguration; public class RewardedVideoAdUnit extends VideoBaseAdUnit { public RewardedVideoAdUnit(@NonNull String configId) { - super(configId, AdType.REWARDED_VIDEO); + super(configId, AdUnitConfiguration.AdUnitIdentifierType.VAST); } } diff --git a/PrebidMobile/PrebidMobile-core/src/main/java/org/prebid/mobile/Util.java b/PrebidMobile/PrebidMobile-core/src/main/java/org/prebid/mobile/Util.java index e65dda334..7a6d1b831 100644 --- a/PrebidMobile/PrebidMobile-core/src/main/java/org/prebid/mobile/Util.java +++ b/PrebidMobile/PrebidMobile-core/src/main/java/org/prebid/mobile/Util.java @@ -421,7 +421,8 @@ static void apply(HashMap bids, Object adObj) { } } - static void saveCacheId(@NonNull String cacheId, Object adObject) { + static void saveCacheId(@Nullable String cacheId, Object adObject) { + if (adObject == null) return; if (adObject.getClass() == getClassFromString(ANDROID_OS_BUNDLE)) { Bundle adBundle = (Bundle) adObject; adBundle.putString(NativeAdUnit.BUNDLE_KEY_CACHE_ID, cacheId); diff --git a/PrebidMobile/PrebidMobile-core/src/main/java/org/prebid/mobile/VideoAdUnit.java b/PrebidMobile/PrebidMobile-core/src/main/java/org/prebid/mobile/VideoAdUnit.java index 47d3bea78..2534e91c4 100644 --- a/PrebidMobile/PrebidMobile-core/src/main/java/org/prebid/mobile/VideoAdUnit.java +++ b/PrebidMobile/PrebidMobile-core/src/main/java/org/prebid/mobile/VideoAdUnit.java @@ -17,13 +17,14 @@ package org.prebid.mobile; import androidx.annotation.NonNull; +import org.prebid.mobile.units.configuration.AdUnitConfiguration; import java.util.HashSet; public class VideoAdUnit extends VideoBaseAdUnit { public VideoAdUnit(@NonNull String configId, int width, int height) { - super(configId, AdType.VIDEO); + super(configId, AdUnitConfiguration.AdUnitIdentifierType.VAST); configuration.addSize(new AdSize(width, height)); } diff --git a/PrebidMobile/PrebidMobile-core/src/main/java/org/prebid/mobile/VideoBaseAdUnit.java b/PrebidMobile/PrebidMobile-core/src/main/java/org/prebid/mobile/VideoBaseAdUnit.java index 0f69a4650..c8df8fa28 100644 --- a/PrebidMobile/PrebidMobile-core/src/main/java/org/prebid/mobile/VideoBaseAdUnit.java +++ b/PrebidMobile/PrebidMobile-core/src/main/java/org/prebid/mobile/VideoBaseAdUnit.java @@ -18,12 +18,13 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; +import org.prebid.mobile.units.configuration.AdUnitConfiguration; import java.util.List; public abstract class VideoBaseAdUnit extends AdUnit { - VideoBaseAdUnit(@NonNull String configId, @NonNull AdType adType) { + VideoBaseAdUnit(@NonNull String configId, @NonNull AdUnitConfiguration.AdUnitIdentifierType adType) { super(configId, adType); } diff --git a/PrebidMobile/PrebidMobile-core/src/main/java/org/prebid/mobile/VideoInterstitialAdUnit.java b/PrebidMobile/PrebidMobile-core/src/main/java/org/prebid/mobile/VideoInterstitialAdUnit.java index fd98638a2..1c6a6d7a7 100644 --- a/PrebidMobile/PrebidMobile-core/src/main/java/org/prebid/mobile/VideoInterstitialAdUnit.java +++ b/PrebidMobile/PrebidMobile-core/src/main/java/org/prebid/mobile/VideoInterstitialAdUnit.java @@ -17,11 +17,12 @@ package org.prebid.mobile; import androidx.annotation.NonNull; +import org.prebid.mobile.units.configuration.AdUnitConfiguration; public class VideoInterstitialAdUnit extends VideoBaseAdUnit { public VideoInterstitialAdUnit(@NonNull String configId) { - super(configId, AdType.VIDEO_INTERSTITIAL); + super(configId, AdUnitConfiguration.AdUnitIdentifierType.INTERSTITIAL); } } diff --git a/PrebidMobile/PrebidMobile-core/src/main/java/org/prebid/mobile/rendering/bidding/data/bid/Bid.java b/PrebidMobile/PrebidMobile-core/src/main/java/org/prebid/mobile/rendering/bidding/data/bid/Bid.java index 3e3d259f3..0155b1eba 100644 --- a/PrebidMobile/PrebidMobile-core/src/main/java/org/prebid/mobile/rendering/bidding/data/bid/Bid.java +++ b/PrebidMobile/PrebidMobile-core/src/main/java/org/prebid/mobile/rendering/bidding/data/bid/Bid.java @@ -84,6 +84,9 @@ public class Bid { // of creatives for which iurl should be representative private String mCid; + // Bid json string. Used only for CacheManager. + private String jsonString; + // Tactic ID to enable buyers to label bids for reporting to the // exchange the tactic through which their bid was submitted private String mTactic; @@ -236,11 +239,16 @@ public int getExp() { return mExp; } + public String getJsonString() { + return jsonString; + } + public static Bid fromJSONObject(JSONObject jsonObject) { Bid bid = new Bid(); if (jsonObject == null) { return bid; } + bid.jsonString = jsonObject.toString(); bid.mId = jsonObject.optString("id", null); bid.mImpId = jsonObject.optString("impid", null); bid.mPrice = jsonObject.optDouble("price", 0); diff --git a/PrebidMobile/PrebidMobile-core/src/main/java/org/prebid/mobile/rendering/bidding/data/bid/BidResponse.java b/PrebidMobile/PrebidMobile-core/src/main/java/org/prebid/mobile/rendering/bidding/data/bid/BidResponse.java index b0605f213..0bc8339d0 100644 --- a/PrebidMobile/PrebidMobile-core/src/main/java/org/prebid/mobile/rendering/bidding/data/bid/BidResponse.java +++ b/PrebidMobile/PrebidMobile-core/src/main/java/org/prebid/mobile/rendering/bidding/data/bid/BidResponse.java @@ -57,6 +57,7 @@ public class BidResponse { private boolean mHasParseError = false; private String mParseError; + private String winningBidJson; private long mCreationTime; @@ -104,7 +105,13 @@ public int getNbr() { return mNbr; } + public String getWinningBidJson() { + return winningBidJson; + } + private void parseJson(String json) { + winningBidJson = json; + try { JSONObject responseJson = new JSONObject(json); mId = responseJson.optString("id"); @@ -153,6 +160,7 @@ public Bid getWinningBid() { for (Seatbid seatbid : mSeatbids) { for (Bid bid : seatbid.getBids()) { if (hasWinningKeywords(bid.getPrebid())) { + winningBidJson = bid.getJsonString(); return bid; } } diff --git a/PrebidMobile/PrebidMobile-core/src/main/java/org/prebid/mobile/rendering/bidding/display/BidResponseCache.java b/PrebidMobile/PrebidMobile-core/src/main/java/org/prebid/mobile/rendering/bidding/display/BidResponseCache.java index 13ddd1b3a..368427e4d 100644 --- a/PrebidMobile/PrebidMobile-core/src/main/java/org/prebid/mobile/rendering/bidding/display/BidResponseCache.java +++ b/PrebidMobile/PrebidMobile-core/src/main/java/org/prebid/mobile/rendering/bidding/display/BidResponseCache.java @@ -65,8 +65,8 @@ public static synchronized BidResponseCache getInstance() { * * @param response Parsed bid response */ - void putBidResponse( - final BidResponse response) { + public void putBidResponse( + final BidResponse response) { putBidResponse(response.getId(), response); } diff --git a/PrebidMobile/PrebidMobile-core/src/main/java/org/prebid/mobile/rendering/models/openrtb/bidRequests/Imp.java b/PrebidMobile/PrebidMobile-core/src/main/java/org/prebid/mobile/rendering/models/openrtb/bidRequests/Imp.java index 8adb23663..8390ff468 100644 --- a/PrebidMobile/PrebidMobile-core/src/main/java/org/prebid/mobile/rendering/models/openrtb/bidRequests/Imp.java +++ b/PrebidMobile/PrebidMobile-core/src/main/java/org/prebid/mobile/rendering/models/openrtb/bidRequests/Imp.java @@ -32,6 +32,7 @@ public class Imp extends BaseBid { public Banner banner = null; public Video video = null; public Pmp pmp = null; + public Native nativeObj; private Ext mExt = null; public Integer clickBrowser = null; @@ -51,6 +52,7 @@ public JSONObject getJsonObject() throws JSONException { toJSON(jsonObject, "banner", (banner != null) ? banner.getJsonObject() : null); toJSON(jsonObject, "video", (video != null) ? video.getJsonObject() : null); + toJSON(jsonObject, "native", (nativeObj != null) ? nativeObj.getJsonObject() : null); toJSON(jsonObject, "pmp", (pmp != null) ? pmp.getJsonObject() : null); toJSON(jsonObject, "ext", (mExt != null) ? mExt.getJsonObject() : null); @@ -79,4 +81,11 @@ public Video getVideo() { return video; } + public Native getNative() { + if (nativeObj == null) { + nativeObj = new Native(); + } + return nativeObj; + } + } diff --git a/PrebidMobile/PrebidMobile-core/src/main/java/org/prebid/mobile/rendering/models/openrtb/bidRequests/Native.java b/PrebidMobile/PrebidMobile-core/src/main/java/org/prebid/mobile/rendering/models/openrtb/bidRequests/Native.java new file mode 100644 index 000000000..bae920b4b --- /dev/null +++ b/PrebidMobile/PrebidMobile-core/src/main/java/org/prebid/mobile/rendering/models/openrtb/bidRequests/Native.java @@ -0,0 +1,101 @@ +package org.prebid.mobile.rendering.models.openrtb.bidRequests; + +import org.json.JSONArray; +import org.json.JSONException; +import org.json.JSONObject; +import org.prebid.mobile.NativeAsset; +import org.prebid.mobile.NativeEventTracker; +import org.prebid.mobile.PrebidMobile; +import org.prebid.mobile.units.configuration.NativeAdUnitConfiguration; + +import java.util.ArrayList; +import java.util.List; + +public class Native extends BaseBid { + private JSONObject mRequest; + private Ext mExt; + + // Won't be implemented in 1.1 + private int[] mApi; + private int[] mBattr; + + public JSONObject getJsonObject() throws JSONException { + JSONObject jsonObject = new JSONObject(); + jsonObject.put("request", mRequest.toString()); + jsonObject.put("ver", PrebidMobile.NATIVE_VERSION); + jsonObject.putOpt("ext", mExt != null ? mExt.getJsonObject() : null); + return jsonObject; + } + + public void setRequestFrom(NativeAdUnitConfiguration config) { + mRequest = new JSONObject(); + try { + mRequest.put("ver", PrebidMobile.NATIVE_VERSION); + if (config.getContextType() != null) { + mRequest.put("context", config.getContextType().getID()); + } + if (config.getContextSubtype() != null) { + mRequest.put("contextsubtype", config.getContextSubtype().getID()); + } + if (config.getPlacementType() != null) { + mRequest.put("plcmttype", config.getPlacementType().getID()); + } + if (config.getSeq() >= 0) { + mRequest.put("seq", config.getSeq()); + } + mRequest.put("assets", getAssetsJsonArray(config.getAssets())); + if (!config.getEventTrackers().isEmpty()) { + mRequest.put("eventtrackers", getTrackersJsonArray(config.getEventTrackers())); + } + if (config.getPrivacy()) { + mRequest.put("privacy", 1); + } + mRequest.putOpt("ext", config.getExt() != null + ? config.getExt() + : null); + } catch (JSONException e) { + e.printStackTrace(); + } + } + + public Ext getExt() { + if (mExt == null) { + mExt = new Ext(); + } + return mExt; + } + + private JSONArray getAssetsJsonArray(List assetList) throws JSONException { + JSONArray assetJsonArray = new JSONArray(); + for (NativeAsset asset : assetList) { + assetJsonArray.put(asset.getJsonObject()); + } + return assetJsonArray; + } + + private JSONArray getTrackersJsonArray(List trackerList) + throws JSONException { + JSONArray trackersJsonArray = new JSONArray(); + for (NativeEventTracker eventTracker : trackerList) { + JSONObject evenTrackerJson = new JSONObject(); + if (eventTracker.getEvent() != null) { + evenTrackerJson.put("event", eventTracker.getEvent().getID()); + } + + ArrayList eventTrackingMethods = eventTracker.getMethods(); + if (eventTrackingMethods != null) { + JSONArray methodsArray = new JSONArray(); + for (NativeEventTracker.EVENT_TRACKING_METHOD method : eventTrackingMethods) { + methodsArray.put(method.getID()); + } + evenTrackerJson.put("methods", methodsArray); + } + + if (eventTracker.getExtObject() != null) { + evenTrackerJson.put("ext", eventTracker.getExtObject()); + } + trackersJsonArray.put(evenTrackerJson); + } + return trackersJsonArray; + } +} \ No newline at end of file diff --git a/PrebidMobile/PrebidMobile-core/src/main/java/org/prebid/mobile/rendering/networking/parameters/BasicParameterBuilder.java b/PrebidMobile/PrebidMobile-core/src/main/java/org/prebid/mobile/rendering/networking/parameters/BasicParameterBuilder.java index 9458c4c19..249701cae 100644 --- a/PrebidMobile/PrebidMobile-core/src/main/java/org/prebid/mobile/rendering/networking/parameters/BasicParameterBuilder.java +++ b/PrebidMobile/PrebidMobile-core/src/main/java/org/prebid/mobile/rendering/networking/parameters/BasicParameterBuilder.java @@ -103,7 +103,9 @@ private void configureImpObject(Imp imp, String uuid) { if (mAdConfiguration != null) { setDisplayManager(imp); setCommonImpValues(imp, uuid); - if (mAdConfiguration.isAdType(AdUnitConfiguration.AdUnitIdentifierType.VAST)) { + if (mAdConfiguration.getNativeConfiguration() != null) { + setNativeImpValues(imp); + } else if (mAdConfiguration.isAdType(AdUnitConfiguration.AdUnitIdentifierType.VAST)) { setVideoImpValues(imp); } else { setBannerImpValues(imp); @@ -232,6 +234,12 @@ private void setBannerImpValues(Imp imp) { imp.banner = banner; } + private void setNativeImpValues(Imp imp) { + if (mAdConfiguration.getNativeConfiguration() != null) { + imp.getNative().setRequestFrom(mAdConfiguration.getNativeConfiguration()); + } + } + private void setCommonImpValues(Imp imp, String uuid) { imp.id = uuid; boolean isInterstitial = mAdConfiguration.isAdType(AdUnitConfiguration.AdUnitIdentifierType.VAST) || diff --git a/PrebidMobile/PrebidMobile-core/src/main/java/org/prebid/mobile/units/configuration/AdUnitConfiguration.java b/PrebidMobile/PrebidMobile-core/src/main/java/org/prebid/mobile/units/configuration/AdUnitConfiguration.java index 522e42d1f..c327d395e 100644 --- a/PrebidMobile/PrebidMobile-core/src/main/java/org/prebid/mobile/units/configuration/AdUnitConfiguration.java +++ b/PrebidMobile/PrebidMobile-core/src/main/java/org/prebid/mobile/units/configuration/AdUnitConfiguration.java @@ -307,12 +307,8 @@ public int getBroadcastId() { } - public boolean isNative() { - return nativeConfiguration != null; - } - /** - * Creates native configuration. + * Creates native configuration. It must be used for Native ad units. */ public void initNativeConfiguration() { nativeConfiguration = new NativeAdUnitConfiguration(); diff --git a/PrebidMobile/PrebidMobile-core/src/main/java/org/prebid/mobile/units/configuration/NativeAdUnitConfiguration.java b/PrebidMobile/PrebidMobile-core/src/main/java/org/prebid/mobile/units/configuration/NativeAdUnitConfiguration.java index 7cc195d49..77d929784 100644 --- a/PrebidMobile/PrebidMobile-core/src/main/java/org/prebid/mobile/units/configuration/NativeAdUnitConfiguration.java +++ b/PrebidMobile/PrebidMobile-core/src/main/java/org/prebid/mobile/units/configuration/NativeAdUnitConfiguration.java @@ -6,6 +6,7 @@ import org.prebid.mobile.NativeEventTracker; import java.util.ArrayList; +import java.util.List; public class NativeAdUnitConfiguration { @@ -25,7 +26,7 @@ public void addEventTracker(NativeEventTracker tracker) { nativeEventTrackers.add(tracker); } - public ArrayList getEventTrackers() { + public List getEventTrackers() { return nativeEventTrackers; }