Skip to content

Commit

Permalink
feat(AdMob): create AdMob interstitial adapter #328
Browse files Browse the repository at this point in the history
Add example to Kotlin test app.
  • Loading branch information
ValentinPostindustria committed Jan 19, 2022
1 parent 5165713 commit 96e77f2
Show file tree
Hide file tree
Showing 4 changed files with 229 additions and 0 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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, _, _ ->
Expand Down
Original file line number Diff line number Diff line change
@@ -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
}

}
Original file line number Diff line number Diff line change
@@ -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<String, String> keywords) {

}

@Override
public boolean canPerformRefresh() {
return false;
}

}
Original file line number Diff line number Diff line change
@@ -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<String, String> 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"));
}
};
}

}

0 comments on commit 96e77f2

Please sign in to comment.