Make one ad request in ImaAdsLoader

This fixes an issue where quickly detaching and reattaching the player might
cause ads to be requested multiple times with both responses handled.

-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=177922167
This commit is contained in:
andrewlewis 2017-12-05 00:29:56 -08:00 committed by Oliver Woodman
parent b3ebdaaed3
commit 59f6b059b0

View File

@ -50,6 +50,7 @@ import com.google.android.exoplayer2.source.ads.AdPlaybackState;
import com.google.android.exoplayer2.source.ads.AdsLoader;
import com.google.android.exoplayer2.util.Assertions;
import com.google.android.exoplayer2.util.MimeTypes;
import com.google.android.exoplayer2.util.Util;
import java.io.IOException;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@ -120,6 +121,7 @@ public final class ImaAdsLoader extends Player.DefaultEventListener implements A
private final AdDisplayContainer adDisplayContainer;
private final com.google.ads.interactivemedia.v3.api.AdsLoader adsLoader;
private Object pendingAdRequestContext;
private List<String> supportedMimeTypes;
private EventListener eventListener;
private Player player;
@ -183,10 +185,6 @@ public final class ImaAdsLoader extends Player.DefaultEventListener implements A
* Whether {@link #getContentProgress()} has sent {@link #pendingContentPositionMs} to IMA.
*/
private boolean sentPendingContentPositionMs;
/**
* Whether {@link #release()} has been called.
*/
private boolean released;
/**
* Creates a new IMA ads loader.
@ -296,7 +294,7 @@ public final class ImaAdsLoader extends Player.DefaultEventListener implements A
@Override
public void release() {
released = true;
pendingAdRequestContext = null;
if (adsManager != null) {
adsManager.destroy();
adsManager = null;
@ -308,10 +306,11 @@ public final class ImaAdsLoader extends Player.DefaultEventListener implements A
@Override
public void onAdsManagerLoaded(AdsManagerLoadedEvent adsManagerLoadedEvent) {
AdsManager adsManager = adsManagerLoadedEvent.getAdsManager();
if (released) {
if (!Util.areEqual(pendingAdRequestContext, adsManagerLoadedEvent.getUserRequestContext())) {
adsManager.destroy();
return;
}
pendingAdRequestContext = null;
this.adsManager = adsManager;
adsManager.addAdErrorListener(this);
adsManager.addAdEventListener(this);
@ -403,6 +402,7 @@ public final class ImaAdsLoader extends Player.DefaultEventListener implements A
Log.d(TAG, "onAdError " + adErrorEvent);
}
if (adsManager == null) {
pendingAdRequestContext = null;
adPlaybackState = new AdPlaybackState(new long[0]);
updateAdPlaybackState();
}
@ -623,10 +623,16 @@ public final class ImaAdsLoader extends Player.DefaultEventListener implements A
// Internal methods.
private void requestAds() {
if (pendingAdRequestContext != null) {
// Ad request already in flight.
return;
}
pendingAdRequestContext = new Object();
AdsRequest request = imaSdkFactory.createAdsRequest();
request.setAdTagUrl(adTagUri.toString());
request.setAdDisplayContainer(adDisplayContainer);
request.setContentProgressProvider(this);
request.setUserRequestContext(pendingAdRequestContext);
adsLoader.requestAds(request);
}