From 96e77f2a34db10226a4ed96b78a522fa48d6c27f Mon Sep 17 00:00:00 2001 From: Valentin Petrovych Date: Wed, 19 Jan 2022 14:20:37 +0200 Subject: [PATCH] feat(AdMob): create AdMob interstitial adapter #328 Add example to Kotlin test app. --- .../prebidkotlindemo/AdTypesRepository.kt | 12 ++ .../ads/inappadmob/InAppAdMobInterstitial.kt | 61 +++++++++ .../AdMobInterstitialMediationUtils.java | 35 +++++ .../admob/PrebidInterstitialAdapter.java | 121 ++++++++++++++++++ 4 files changed, 229 insertions(+) create mode 100644 Example/PrebidDemoKotlin/src/main/java/org/prebid/mobile/prebidkotlindemo/ads/inappadmob/InAppAdMobInterstitial.kt create mode 100644 PrebidMobile/PrebidMobile-admobAdapters/src/main/java/org/prebid/mobile/admob/AdMobInterstitialMediationUtils.java create mode 100644 PrebidMobile/PrebidMobile-admobAdapters/src/main/java/org/prebid/mobile/admob/PrebidInterstitialAdapter.java diff --git a/Example/PrebidDemoKotlin/src/main/java/org/prebid/mobile/prebidkotlindemo/AdTypesRepository.kt b/Example/PrebidDemoKotlin/src/main/java/org/prebid/mobile/prebidkotlindemo/AdTypesRepository.kt index d85a67327..d8d6da2f0 100644 --- a/Example/PrebidDemoKotlin/src/main/java/org/prebid/mobile/prebidkotlindemo/AdTypesRepository.kt +++ b/Example/PrebidDemoKotlin/src/main/java/org/prebid/mobile/prebidkotlindemo/AdTypesRepository.kt @@ -7,6 +7,7 @@ import org.prebid.mobile.prebidkotlindemo.ads.MoPubBanner import org.prebid.mobile.prebidkotlindemo.ads.MoPubInterstitial import org.prebid.mobile.prebidkotlindemo.ads.inapp.* import org.prebid.mobile.prebidkotlindemo.ads.inappadmob.InAppAdMobBanner +import org.prebid.mobile.prebidkotlindemo.ads.inappadmob.InAppAdMobInterstitial import org.prebid.mobile.prebidkotlindemo.ads.inappadmob.InAppAdMobRewarded import org.prebid.mobile.prebidkotlindemo.ads.inappgam.* import org.prebid.mobile.prebidkotlindemo.ads.inappmopub.InAppMoPubBanner @@ -277,6 +278,17 @@ object AdTypesRepository { }, onDestroy = { InAppAdMobBanner.destroy() } ), + AdType( + "Interstitial", + onCreate = { activity, _, _ -> + InAppAdMobInterstitial.create( + activity, + "ca-app-pub-1875909575462531/6393291067", + "5a4b8dcf-f984-4b04-9448-6529908d6cb6" + ) + }, + onDestroy = { InAppAdMobInterstitial.destroy() } + ), AdType( "Rewarded", onCreate = { activity, _, _ -> diff --git a/Example/PrebidDemoKotlin/src/main/java/org/prebid/mobile/prebidkotlindemo/ads/inappadmob/InAppAdMobInterstitial.kt b/Example/PrebidDemoKotlin/src/main/java/org/prebid/mobile/prebidkotlindemo/ads/inappadmob/InAppAdMobInterstitial.kt new file mode 100644 index 000000000..9597134f7 --- /dev/null +++ b/Example/PrebidDemoKotlin/src/main/java/org/prebid/mobile/prebidkotlindemo/ads/inappadmob/InAppAdMobInterstitial.kt @@ -0,0 +1,61 @@ +package org.prebid.mobile.prebidkotlindemo.ads.inappadmob + +import android.app.Activity +import android.os.Bundle +import android.util.Log +import com.google.android.gms.ads.AdRequest +import com.google.android.gms.ads.LoadAdError +import com.google.android.gms.ads.interstitial.InterstitialAd +import com.google.android.gms.ads.interstitial.InterstitialAdLoadCallback +import org.prebid.mobile.admob.AdMobInterstitialMediationUtils +import org.prebid.mobile.admob.PrebidInterstitialAdapter +import org.prebid.mobile.rendering.bidding.display.MediationInterstitialAdUnit +import org.prebid.mobile.rendering.bidding.enums.AdUnitFormat + +object InAppAdMobInterstitial { + + private var adUnit: MediationInterstitialAdUnit? = null + private var interstitialAd: InterstitialAd? = null + + fun create( + activity: Activity, + adUnitId: String, + configId: String + ) { + val extras = Bundle() + val request = AdRequest + .Builder() + .addCustomEventExtrasBundle(PrebidInterstitialAdapter::class.java, extras) + .build() + val mediationUtils = AdMobInterstitialMediationUtils(extras) + + adUnit = MediationInterstitialAdUnit( + activity, + configId, + AdUnitFormat.DISPLAY, + mediationUtils + ) + adUnit?.fetchDemand { result -> + Log.d("Prebid", "Fetch demand result: $result") + + InterstitialAd.load(activity, adUnitId, request, object : InterstitialAdLoadCallback() { + override fun onAdLoaded(interstitial: InterstitialAd) { + interstitialAd = interstitial + interstitialAd?.show(activity) + } + + override fun onAdFailedToLoad(error: LoadAdError) { + interstitialAd = null + } + }) + } + } + + fun destroy() { + adUnit?.destroy() + adUnit = null + + interstitialAd = null + } + +} \ No newline at end of file diff --git a/PrebidMobile/PrebidMobile-admobAdapters/src/main/java/org/prebid/mobile/admob/AdMobInterstitialMediationUtils.java b/PrebidMobile/PrebidMobile-admobAdapters/src/main/java/org/prebid/mobile/admob/AdMobInterstitialMediationUtils.java new file mode 100644 index 000000000..1b5b4856e --- /dev/null +++ b/PrebidMobile/PrebidMobile-admobAdapters/src/main/java/org/prebid/mobile/admob/AdMobInterstitialMediationUtils.java @@ -0,0 +1,35 @@ +package org.prebid.mobile.admob; + +import android.os.Bundle; +import androidx.annotation.Nullable; +import org.prebid.mobile.rendering.bidding.data.bid.BidResponse; +import org.prebid.mobile.rendering.bidding.display.PrebidMediationDelegate; + +import java.util.HashMap; + +public class AdMobInterstitialMediationUtils implements PrebidMediationDelegate { + + private final Bundle extras; + + public AdMobInterstitialMediationUtils(Bundle adMobExtrasBundle) { + this.extras = adMobExtrasBundle; + } + + @Override + public void setResponseToLocalExtras(@Nullable BidResponse response) { + if (response != null) { + extras.putString(PrebidInterstitialAdapter.EXTRA_RESPONSE_ID, response.getId()); + } + } + + @Override + public void handleKeywordsUpdate(@Nullable HashMap keywords) { + + } + + @Override + public boolean canPerformRefresh() { + return false; + } + +} diff --git a/PrebidMobile/PrebidMobile-admobAdapters/src/main/java/org/prebid/mobile/admob/PrebidInterstitialAdapter.java b/PrebidMobile/PrebidMobile-admobAdapters/src/main/java/org/prebid/mobile/admob/PrebidInterstitialAdapter.java new file mode 100644 index 000000000..4846d0c24 --- /dev/null +++ b/PrebidMobile/PrebidMobile-admobAdapters/src/main/java/org/prebid/mobile/admob/PrebidInterstitialAdapter.java @@ -0,0 +1,121 @@ +package org.prebid.mobile.admob; + +import android.content.Context; +import android.os.Bundle; +import android.util.Log; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import com.google.android.gms.ads.AdError; +import com.google.android.gms.ads.mediation.MediationAdRequest; +import com.google.android.gms.ads.mediation.customevent.CustomEventInterstitial; +import com.google.android.gms.ads.mediation.customevent.CustomEventInterstitialListener; +import org.prebid.mobile.LogUtil; +import org.prebid.mobile.rendering.bidding.display.BidResponseCache; +import org.prebid.mobile.rendering.bidding.display.InterstitialController; +import org.prebid.mobile.rendering.bidding.interfaces.InterstitialControllerListener; +import org.prebid.mobile.rendering.errors.AdException; + +import java.util.HashMap; + +public class PrebidInterstitialAdapter extends PrebidBaseAdapter implements CustomEventInterstitial { + + private static final String TAG = "PrebidInterstitial"; + public static final String EXTRA_RESPONSE_ID = "PrebidInterstitialAdapterExtraId"; + + private InterstitialController interstitialController; + + @Override + public void requestInterstitialAd( + @NonNull Context context, + @NonNull CustomEventInterstitialListener adMobListener, + @Nullable String serverParameter, + @NonNull MediationAdRequest mediationAdRequest, + @Nullable Bundle extras + ) { + if (extras == null) { + String error = "Extras are empty! Check if you add custom event extras bundle to " + TAG; + Log.e(TAG, error); + adMobListener.onAdFailedToLoad(new AdError(1001, error, "prebid")); + return; + } + + String responseId = extras.getString(EXTRA_RESPONSE_ID); + if (responseId == null) { + String error = "Response id is null"; + adMobListener.onAdFailedToLoad(new AdError(1002, error, "prebid")); + return; + } + + HashMap prebidParameters = BidResponseCache.getInstance().getKeywords(responseId); + if (!ParametersMatcher.doParametersMatch(serverParameter, prebidParameters)) { + String error = "Parameters are different"; + adMobListener.onAdFailedToLoad(new AdError(1003, error, "prebid")); + return; + } + LogUtil.v(TAG, "Parameters are matched! (" + serverParameter + ")"); + + try { + InterstitialControllerListener listener = getListener(adMobListener); + interstitialController = new InterstitialController(context, listener); + interstitialController.loadAd(responseId, false); + } catch (AdException e) { + String error = "Exception in Prebid interstitial controller (" + e.getMessage() + ")"; + Log.e(TAG, error); + adMobListener.onAdFailedToLoad(new AdError(1004, error, "prebid")); + } + + } + + @Override + public void showInterstitial() { + + } + + @Override + public void onDestroy() { + interstitialController.destroy(); + } + + @Override + public void onPause() { + + } + + @Override + public void onResume() { + + } + + private InterstitialControllerListener getListener(CustomEventInterstitialListener adMobListener) { + return new InterstitialControllerListener() { + @Override + public void onInterstitialReadyForDisplay() { + adMobListener.onAdLoaded(); + interstitialController.show(); + } + + @Override + public void onInterstitialDisplayed() { + adMobListener.onAdOpened(); + } + + @Override + public void onInterstitialClicked() { + adMobListener.onAdClicked(); + } + + @Override + public void onInterstitialClosed() { + adMobListener.onAdClosed(); + } + + @Override + public void onInterstitialFailedToLoad(AdException exception) { + String error = "Failed to load ad: " + exception.getMessage(); + Log.e(TAG, error); + adMobListener.onAdFailedToLoad(new AdError(1005, error, "prebid")); + } + }; + } + +}