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