Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
package com.google.unity.ads.nextgen;

import com.google.android.libraries.ads.mobile.sdk.appopen.AppOpenAd;
import com.google.android.libraries.ads.mobile.sdk.banner.BannerAd;
import com.google.android.libraries.ads.mobile.sdk.banner.BannerAdRequest;
import com.google.android.libraries.ads.mobile.sdk.common.AdLoadCallback;
import com.google.android.libraries.ads.mobile.sdk.common.AdRequest;
import com.google.android.libraries.ads.mobile.sdk.interstitial.InterstitialAd;
Expand Down Expand Up @@ -35,6 +37,22 @@ public static AdWrapper<AppOpenAd> forAppOpen() {
return new AdWrapper<>(AppOpenAd::load);
}

/** Creates a new AdWrapper for loading BannerAds. */
public static AdWrapper<BannerAd> forBanner() {
return new AdWrapper<BannerAd>(
new AdLoader<BannerAd>() {
@Override
public void load(AdRequest adRequest, AdLoadCallback<BannerAd> callback) {
if (adRequest instanceof BannerAdRequest) {
BannerAd.load((BannerAdRequest) adRequest, callback);
} else {
throw new IllegalArgumentException(
"AdRequest must be of type BannerAdRequest for Banner Ads");
}
}
});
}

/** Creates a new AdWrapper for loading InterstitialAds. */
public static AdWrapper<InterstitialAd> forInterstitial() {
return new AdWrapper<>(InterstitialAd::load);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@
import android.widget.FrameLayout;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.VisibleForTesting;
import com.google.android.libraries.ads.mobile.sdk.banner.BannerAd;
import com.google.android.libraries.ads.mobile.sdk.banner.BannerAdEventCallback;
import com.google.android.libraries.ads.mobile.sdk.banner.BannerAdRequest;
Expand Down Expand Up @@ -54,9 +55,13 @@ protected static class Insets {
/** The {@link BannerAd} to display to the user. */
private BannerAd bannerAd;

/** The {@link AdWrapper} used to load ads. */
private final AdWrapper<BannerAd> adWrapper;

/** The {@link View} that contains the banner ad. */
private View adView;


/** A code indicating where to place the ad. */
private int positionCode;

Expand Down Expand Up @@ -91,8 +96,14 @@ protected static class Insets {
private View.OnLayoutChangeListener layoutChangeListener;

public UnityBannerAd(Activity activity, UnityBannerAdCallback callback) {
this(activity, callback, AdWrapper.forBanner());
}

@VisibleForTesting
UnityBannerAd(Activity activity, UnityBannerAdCallback callback, AdWrapper<BannerAd> adWrapper) {
unityPlayerActivity = activity;
this.callback = callback;
this.adWrapper = adWrapper;
}

/**
Expand Down Expand Up @@ -121,7 +132,7 @@ public void create(final int positionX, final int positionY) {
}

protected void load(final BannerAdRequest adRequest) {
BannerAd.load(
adWrapper.load(
adRequest,
new AdLoadCallback<BannerAd>() {
@Override
Expand Down Expand Up @@ -368,13 +379,19 @@ public void destroy() {
.getDecorView()
.getRootView()
.removeOnLayoutChangeListener(layoutChangeListener);

layoutChangeListener = null;
}

/**
* Sets the layout change listener for the {@link AdView} to detect orientation changes and
* reposition banner ads as required.
*/
protected void setLayoutChangeListener() {
if (layoutChangeListener != null) {
return;
}

layoutChangeListener =
new View.OnLayoutChangeListener() {
@Override
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,163 @@
package com.google.unity.ads.nextgen;

import android.app.Activity;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.VisibleForTesting;
import com.google.android.libraries.ads.mobile.sdk.banner.BannerAd;
import com.google.android.libraries.ads.mobile.sdk.banner.BannerAdPreloader;
import com.google.android.libraries.ads.mobile.sdk.common.AdLoadCallback;
import com.google.android.libraries.ads.mobile.sdk.common.AdRequest;
import com.google.android.libraries.ads.mobile.sdk.common.LoadAdError;
import com.google.android.libraries.ads.mobile.sdk.common.PreloadCallback;
import com.google.android.libraries.ads.mobile.sdk.common.PreloadConfiguration;
import com.google.android.libraries.ads.mobile.sdk.common.ResponseInfo;
import java.util.Map;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/** Unity implementation of the {@link BannerAdPreloader}. */
public class UnityBannerAdPreloader {

/** The {@code Activity} on which the banner ad will display. */
private final Activity activity;

/** An executor used to run the callbacks. */
private final ExecutorService service;

/**
* A {@code UnityPreloadCallback} implemented in Unity via {@code AndroidJavaProxy} to receive ad
* events.
*/
private final UnityPreloadCallback preloadCallback;

private final BannerAdPreloaderWrapper preloaderWrapper;

public UnityBannerAdPreloader(Activity activity, UnityPreloadCallback preloadCallback) {
this(
activity,
preloadCallback,
new BannerAdPreloaderWrapper(),
Executors.newSingleThreadExecutor());
}

@VisibleForTesting
public UnityBannerAdPreloader(
Activity activity,
UnityPreloadCallback preloadCallback,
BannerAdPreloaderWrapper preloaderWrapper,
ExecutorService service) {
this.activity = activity;
this.preloadCallback = preloadCallback;
this.service = service;
this.preloaderWrapper = preloaderWrapper;
}

public boolean start(String preloadId, PreloadConfiguration preloadConfiguration) {
return preloaderWrapper.start(
preloadId,
preloadConfiguration,
new PreloadCallback() {
@Override
public void onAdPreloaded(@NonNull String preloadId, ResponseInfo responseInfo) {
service.execute(
() -> {
if (preloadCallback != null) {
preloadCallback.onAdPreloaded(preloadId, responseInfo);
}
});
}

@Override
public void onAdsExhausted(@NonNull String preloadId) {
service.execute(
() -> {
if (preloadCallback != null) {
preloadCallback.onAdsExhausted(preloadId);
}
});
}

@Override
public void onAdFailedToPreload(@NonNull String preloadId, @NonNull LoadAdError adError) {
service.execute(
() -> {
if (preloadCallback != null) {
preloadCallback.onAdFailedToPreload(preloadId, adError);
}
});
}
});
}

public boolean isAdAvailable(String preloadId) {
return preloaderWrapper.isAdAvailable(preloadId);
}

public int getNumAdsAvailable(String preloadId) {
return preloaderWrapper.getNumAdsAvailable(preloadId);
}

@SuppressWarnings("VisibleForTests")
@Nullable
public UnityBannerAd pollAd(String preloadId, UnityBannerAdCallback callback) {
final BannerAd pooledAd = preloaderWrapper.pollAd(preloadId);
if (pooledAd == null) {
return null;
}
AdWrapper<BannerAd> preloadedWrapper =
new AdWrapper<BannerAd>(
new AdWrapper.AdLoader<BannerAd>() {
@Override
public void load(AdRequest adRequest, AdLoadCallback<BannerAd> loadCallback) {
loadCallback.onAdLoaded(pooledAd);
}
});
return new UnityBannerAd(activity, callback, preloadedWrapper);
}

@Nullable
public PreloadConfiguration getConfiguration(String preloadId) {
return preloaderWrapper.getConfiguration(preloadId);
}

public Map<String, PreloadConfiguration> getConfigurations() {
return preloaderWrapper.getConfigurations();
}

public void destroy(String preloadId) {
boolean unused = preloaderWrapper.destroy(preloadId);
}

/** Wrapper for BannerAdPreloader static methods to facilitate testing. */
@VisibleForTesting
public static class BannerAdPreloaderWrapper {
public boolean start(String preloadId, PreloadConfiguration config, PreloadCallback callback) {
return BannerAdPreloader.start(preloadId, config, callback);
}

public boolean isAdAvailable(String preloadId) {
return BannerAdPreloader.isAdAvailable(preloadId);
}

public int getNumAdsAvailable(String preloadId) {
return BannerAdPreloader.getNumAdsAvailable(preloadId);
}

public BannerAd pollAd(String preloadId) {
return BannerAdPreloader.pollAd(preloadId);
}

public PreloadConfiguration getConfiguration(String preloadId) {
return BannerAdPreloader.getConfiguration(preloadId);
}

public Map<String, PreloadConfiguration> getConfigurations() {
return BannerAdPreloader.getConfigurations();
}

public boolean destroy(String preloadId) {
return BannerAdPreloader.destroy(preloadId);
}
}
}
Loading