Handle errors in all VideoAdPlayer callbacks
Some but not all VideoAdPlayer callbacks from the IMA SDK included defensive handling of unexpected cases. Add the remaining ones. Issue: #7492 PiperOrigin-RevId: 316082651
This commit is contained in:
parent
c5144dc777
commit
5a88e0bc1d
@ -208,7 +208,10 @@
|
|||||||
([#6922](https://github.com/google/ExoPlayer/pull/6922)).
|
([#6922](https://github.com/google/ExoPlayer/pull/6922)).
|
||||||
* Cast extension: Implement playlist API and deprecate the old queue
|
* Cast extension: Implement playlist API and deprecate the old queue
|
||||||
manipulation API.
|
manipulation API.
|
||||||
* IMA extension: Add option to skip ads before the start position.
|
* IMA extension:
|
||||||
|
* Add option to skip ads before the start position.
|
||||||
|
* Catch unexpected errors in `stopAd` to avoid a crash
|
||||||
|
([#7492](https://github.com/google/ExoPlayer/issues/7492)).
|
||||||
* Demo app: Retain previous position in list of samples.
|
* Demo app: Retain previous position in list of samples.
|
||||||
* Add Guava dependency.
|
* Add Guava dependency.
|
||||||
|
|
||||||
|
@ -916,32 +916,36 @@ public final class ImaAdsLoader
|
|||||||
Log.w(TAG, "Unexpected playAd without stopAd");
|
Log.w(TAG, "Unexpected playAd without stopAd");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (imaAdState == IMA_AD_STATE_NONE) {
|
try {
|
||||||
// IMA is requesting to play the ad, so stop faking the content position.
|
if (imaAdState == IMA_AD_STATE_NONE) {
|
||||||
fakeContentProgressElapsedRealtimeMs = C.TIME_UNSET;
|
// IMA is requesting to play the ad, so stop faking the content position.
|
||||||
fakeContentProgressOffsetMs = C.TIME_UNSET;
|
fakeContentProgressElapsedRealtimeMs = C.TIME_UNSET;
|
||||||
imaAdState = IMA_AD_STATE_PLAYING;
|
fakeContentProgressOffsetMs = C.TIME_UNSET;
|
||||||
imaAdMediaInfo = adMediaInfo;
|
imaAdState = IMA_AD_STATE_PLAYING;
|
||||||
imaAdInfo = Assertions.checkNotNull(adInfoByAdMediaInfo.get(adMediaInfo));
|
imaAdMediaInfo = adMediaInfo;
|
||||||
for (int i = 0; i < adCallbacks.size(); i++) {
|
imaAdInfo = Assertions.checkNotNull(adInfoByAdMediaInfo.get(adMediaInfo));
|
||||||
adCallbacks.get(i).onPlay(adMediaInfo);
|
|
||||||
}
|
|
||||||
if (pendingAdPrepareErrorAdInfo != null && pendingAdPrepareErrorAdInfo.equals(imaAdInfo)) {
|
|
||||||
pendingAdPrepareErrorAdInfo = null;
|
|
||||||
for (int i = 0; i < adCallbacks.size(); i++) {
|
for (int i = 0; i < adCallbacks.size(); i++) {
|
||||||
adCallbacks.get(i).onError(adMediaInfo);
|
adCallbacks.get(i).onPlay(adMediaInfo);
|
||||||
|
}
|
||||||
|
if (pendingAdPrepareErrorAdInfo != null && pendingAdPrepareErrorAdInfo.equals(imaAdInfo)) {
|
||||||
|
pendingAdPrepareErrorAdInfo = null;
|
||||||
|
for (int i = 0; i < adCallbacks.size(); i++) {
|
||||||
|
adCallbacks.get(i).onError(adMediaInfo);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
updateAdProgress();
|
||||||
|
} else {
|
||||||
|
imaAdState = IMA_AD_STATE_PLAYING;
|
||||||
|
Assertions.checkState(adMediaInfo.equals(imaAdMediaInfo));
|
||||||
|
for (int i = 0; i < adCallbacks.size(); i++) {
|
||||||
|
adCallbacks.get(i).onResume(adMediaInfo);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
updateAdProgress();
|
if (!Assertions.checkNotNull(player).getPlayWhenReady()) {
|
||||||
} else {
|
Assertions.checkNotNull(adsManager).pause();
|
||||||
imaAdState = IMA_AD_STATE_PLAYING;
|
|
||||||
Assertions.checkState(adMediaInfo.equals(imaAdMediaInfo));
|
|
||||||
for (int i = 0; i < adCallbacks.size(); i++) {
|
|
||||||
adCallbacks.get(i).onResume(adMediaInfo);
|
|
||||||
}
|
}
|
||||||
}
|
} catch (RuntimeException e) {
|
||||||
if (!Assertions.checkNotNull(player).getPlayWhenReady()) {
|
maybeNotifyInternalError("playAd", e);
|
||||||
Assertions.checkNotNull(adsManager).pause();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -955,9 +959,9 @@ public final class ImaAdsLoader
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
Assertions.checkNotNull(player);
|
|
||||||
Assertions.checkState(imaAdState != IMA_AD_STATE_NONE);
|
|
||||||
try {
|
try {
|
||||||
|
Assertions.checkNotNull(player);
|
||||||
|
Assertions.checkState(imaAdState != IMA_AD_STATE_NONE);
|
||||||
stopAdInternal();
|
stopAdInternal();
|
||||||
} catch (RuntimeException e) {
|
} catch (RuntimeException e) {
|
||||||
maybeNotifyInternalError("stopAd", e);
|
maybeNotifyInternalError("stopAd", e);
|
||||||
@ -973,10 +977,15 @@ public final class ImaAdsLoader
|
|||||||
// This method is called after content is resumed.
|
// This method is called after content is resumed.
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
Assertions.checkState(adMediaInfo.equals(imaAdMediaInfo));
|
|
||||||
imaAdState = IMA_AD_STATE_PAUSED;
|
try {
|
||||||
for (int i = 0; i < adCallbacks.size(); i++) {
|
Assertions.checkState(adMediaInfo.equals(imaAdMediaInfo));
|
||||||
adCallbacks.get(i).onPause(adMediaInfo);
|
imaAdState = IMA_AD_STATE_PAUSED;
|
||||||
|
for (int i = 0; i < adCallbacks.size(); i++) {
|
||||||
|
adCallbacks.get(i).onPause(adMediaInfo);
|
||||||
|
}
|
||||||
|
} catch (RuntimeException e) {
|
||||||
|
maybeNotifyInternalError("pauseAd", e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user