From 59f6b059b0c44c8dcc572ade7fa9f6d815ea0d80 Mon Sep 17 00:00:00 2001 From: andrewlewis Date: Tue, 5 Dec 2017 00:29:56 -0800 Subject: [PATCH] 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 --- .../exoplayer2/ext/ima/ImaAdsLoader.java | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/extensions/ima/src/main/java/com/google/android/exoplayer2/ext/ima/ImaAdsLoader.java b/extensions/ima/src/main/java/com/google/android/exoplayer2/ext/ima/ImaAdsLoader.java index 743a428020..0eba9db2ed 100644 --- a/extensions/ima/src/main/java/com/google/android/exoplayer2/ext/ima/ImaAdsLoader.java +++ b/extensions/ima/src/main/java/com/google/android/exoplayer2/ext/ima/ImaAdsLoader.java @@ -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 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); }