private void setupPlayback(Timeline contentTimeline, long[][] adDurationsUs, Float[] cuePoints) { fakeExoPlayer = new FakePlayer(); adsLoaderListener = new TestAdsLoaderListener(fakeExoPlayer, contentTimeline, adDurationsUs); when(adsManager.getAdCuePoints()).thenReturn(Arrays.asList(cuePoints)); imaAdsLoader = new ImaAdsLoader.Builder(RuntimeEnvironment.application) .setImaFactory(testImaFactory) .setImaSdkSettings(imaSdkSettings) .buildForAdTag(TEST_URI); }
@Override public void onAdsManagerLoaded(AdsManagerLoadedEvent adsManagerLoadedEvent) { AdsManager adsManager = adsManagerLoadedEvent.getAdsManager(); if (!Util.areEqual(pendingAdRequestContext, adsManagerLoadedEvent.getUserRequestContext())) { adsManager.destroy(); return; } pendingAdRequestContext = null; this.adsManager = adsManager; adsManager.addAdErrorListener(this); adsManager.addAdEventListener(this); if (adEventListener != null) { adsManager.addAdEventListener(adEventListener); } if (player != null) { // If a player is attached already, start playback immediately. try { startAdPlayback(); } catch (Exception e) { maybeNotifyInternalError("onAdsManagerLoaded", e); } } }
@Override public void onPlayerStateChanged(boolean playWhenReady, int playbackState) { if (adsManager == null) { return; } if (imaAdState == IMA_AD_STATE_PLAYING && !playWhenReady) { adsManager.pause(); return; } if (imaAdState == IMA_AD_STATE_PAUSED && playWhenReady) { adsManager.resume(); return; } if (imaAdState == IMA_AD_STATE_NONE && playbackState == Player.STATE_BUFFERING && playWhenReady) { checkForContentComplete(); } else if (imaAdState != IMA_AD_STATE_NONE && playbackState == Player.STATE_ENDED) { for (int i = 0; i < adCallbacks.size(); i++) { adCallbacks.get(i).onEnded(); } if (DEBUG) { Log.d(TAG, "VideoAdPlayerCallback.onEnded in onPlayerStateChanged"); } } }
/** * An event raised when ads are successfully loaded from the ad server via an AdsLoader. */ @Override public void onAdsManagerLoaded(AdsManagerLoadedEvent adsManagerLoadedEvent) { // Ads were successfully loaded, so get the AdsManager instance. AdsManager has // events for ad playback and errors. mAdsManager = adsManagerLoadedEvent.getAdsManager(); // Attach event and error event listeners. mAdsManager.addAdErrorListener(this); mAdsManager.addAdEventListener(this); mAdsManager.init(); }
long[] adGroupTimesUs = getAdGroupTimesUs(adsManager.getAdCuePoints()); adPlaybackState = new AdPlaybackState(adGroupTimesUs); long contentPositionMs = player.getCurrentPosition(); adsManager.init(adsRenderingSettings); updateAdPlaybackState(); if (DEBUG) {
@Override public void loadAd(String adUriString) { try { if (DEBUG) { Log.d(TAG, "loadAd in ad group " + adGroupIndex); } if (adsManager == null) { Log.w(TAG, "Ignoring loadAd after release"); return; } if (adGroupIndex == C.INDEX_UNSET) { Log.w( TAG, "Unexpected loadAd without LOADED event; assuming ad group index is actually " + expectedAdGroupIndex); adGroupIndex = expectedAdGroupIndex; adsManager.start(); } int adIndexInAdGroup = getAdIndexInAdGroupToLoad(adGroupIndex); if (adIndexInAdGroup == C.INDEX_UNSET) { Log.w(TAG, "Unexpected loadAd in an ad group with no remaining unavailable ads"); return; } adPlaybackState = adPlaybackState.withAdUri(adGroupIndex, adIndexInAdGroup, Uri.parse(adUriString)); updateAdPlaybackState(); } catch (Exception e) { maybeNotifyInternalError("loadAd", e); } }
@Override public void release() { pendingAdRequestContext = null; if (adsManager != null) { adsManager.destroy(); adsManager = null; } adsLoader.removeAdsLoadedListener(/* adsLoadedListener= */ this); adsLoader.removeAdErrorListener(/* adErrorListener= */ this); imaPausedContent = false; imaAdState = IMA_AD_STATE_NONE; pendingAdLoadError = null; adPlaybackState = AdPlaybackState.NONE; updateAdPlaybackState(); }
adsManager.pause();
@Override public void attachPlayer(ExoPlayer player, EventListener eventListener, ViewGroup adUiViewGroup) { Assertions.checkArgument(player.getApplicationLooper() == Looper.getMainLooper()); this.player = player; this.eventListener = eventListener; lastVolumePercentage = 0; lastAdProgress = null; lastContentProgress = null; adDisplayContainer.setAdContainer(adUiViewGroup); player.addListener(this); maybeNotifyPendingAdLoadError(); if (adPlaybackState != null) { // Pass the ad playback state to the player, and resume ads if necessary. eventListener.onAdPlaybackState(adPlaybackState); if (imaPausedContent && player.getPlayWhenReady()) { adsManager.resume(); } } else if (adsManager != null) { // Ads have loaded but the ads manager is not initialized. startAdPlayback(); } else { // Ads haven't loaded yet, so request them. requestAds(adUiViewGroup); } }
int adPosition = adPodInfo.getAdPosition(); int adCount = adPodInfo.getTotalAds(); adsManager.start(); if (DEBUG) { Log.d(TAG, "Loaded ad " + adPosition + " of " + adCount + " in group " + adGroupIndex);
/** * Releases related resources. */ public void release() { if (mAdsManager != null) { mAdsManager.destroy(); mAdsManager = null; } if (mAdsLoader != null) { mAdsLoader.removeAdsLoadedListener(this); mAdsLoader.removeAdErrorListener(this); } }
@Override public void detachPlayer() { if (adsManager != null && imaPausedContent) { adPlaybackState = adPlaybackState.withAdResumePositionUs( playingAd ? C.msToUs(player.getCurrentPosition()) : 0); adsManager.pause(); } lastVolumePercentage = getVolume(); lastAdProgress = getAdProgress(); lastContentProgress = getContentProgress(); player.removeListener(this); player = null; eventListener = null; }
@Override public void processEvent(Event event) { AdsManager manager = (AdsManager) event.properties.get("adsManager"); List<Float> cuepoints = manager.getAdCuePoints(); for (int i = 0; i < cuepoints.size(); i++) { Float cuepoint = cuepoints.get(i); BrightcoveSeekBar brightcoveSeekBar = mediaController.getBrightcoveSeekBar(); // If cuepoint is negative it means it is a POST ROLL. int markerTime = cuepoint < 0 ? brightcoveSeekBar.getMax() : (int) (cuepoint * DateUtils.SECOND_IN_MILLIS); mediaController.getBrightcoveSeekBar().addMarker(markerTime); } } });
/** * Responds to AdEvents. */ @Override public void onAdEvent(AdEvent adEvent) { if (DEBUG) { Log.d(TAG, "Event: " + adEvent.getType()); } // These are the suggested event types to handle. For full list of all ad event types, // see the documentation for AdEvent.AdEventType. switch (adEvent.getType()) { case LOADED: // AdEventType.LOADED will be fired when ads are ready to be played. // AdsManager.start() begins ad playback. This method is ignored for VMAP or ad // rules playlists, as the SDK will automatically start executing the playlist. mAdsManager.start(); break; case COMPLETED: // AdEventType.COMPLETED is fire when ad is completed, but before the fire of // AdEventType.CONTENT_RESUME_REQUESTED. mAdControllerCallback.onAdCompleted(); release(); break; default: break; } }