package com.kaltura.playersdk.helpers;
import android.app.Activity;
import android.view.ViewGroup;
import android.widget.FrameLayout;
import com.google.ads.interactivemedia.v3.api.Ad;
import com.google.ads.interactivemedia.v3.api.AdDisplayContainer;
import com.google.ads.interactivemedia.v3.api.AdErrorEvent;
import com.google.ads.interactivemedia.v3.api.AdEvent;
import com.google.ads.interactivemedia.v3.api.AdsLoader;
import com.google.ads.interactivemedia.v3.api.AdsManager;
import com.google.ads.interactivemedia.v3.api.AdsManagerLoadedEvent;
import com.google.ads.interactivemedia.v3.api.AdsRenderingSettings;
import com.google.ads.interactivemedia.v3.api.AdsRequest;
import com.google.ads.interactivemedia.v3.api.ImaSdkFactory;
import com.google.ads.interactivemedia.v3.api.UiElement;
import com.google.ads.interactivemedia.v3.api.player.ContentProgressProvider;
import com.kaltura.playersdk.interfaces.KIMAManagerListener;
import com.kaltura.playersdk.players.KIMAAdPlayer;
import com.kaltura.playersdk.players.KMediaFormat;
import org.json.JSONException;
import org.json.JSONObject;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import static com.kaltura.playersdk.utils.LogUtils.LOGD;
import static com.kaltura.playersdk.utils.LogUtils.LOGE;
/**
* Created by nissopa on 6/30/15.
*/
public class KIMAManager implements AdErrorEvent.AdErrorListener,
AdsLoader.AdsLoadedListener, AdEvent.AdEventListener,
KIMAAdPlayer.KIMAAdPlayerEvents {
private static final String TAG = "KIMAManager";
// Container with references to video player and ad UI ViewGroup.
private AdDisplayContainer mAdDisplayContainer;
// The AdsLoader instance exposes the requestAds method.
private AdsLoader mAdsLoader;
// AdsManager exposes methods to control ad playback and listen to ad events.
private AdsManager mAdsManager;
// Factory class for creating SDK objects.
private ImaSdkFactory mSdkFactory;
// Ad-enabled video player.
private KIMAAdPlayer mIMAPlayer;
// Default VAST ad tag; more complex apps might select ad tag based on content video criteria.
private String mDefaultAdTagUrl;
private String mAdMimeType;
private int mAdPreferredBitrate;
private KIMAManagerListener mListener;
private String DurationKey = "duration";
private String TimeKey = "time";
private String RemainKey = "remain";
private String IsLinearKey = "isLinear";
private String AdIDKey = "adID";
private String AdSystemKey = "adSystem";
private String AdPositionKey = "adPosition";
public KIMAManager(Activity context, FrameLayout adPlayerContainer, ViewGroup adUiContainer, String adTagURL, String adMimeType, int adPreferredBitrate) {
mAdMimeType = adMimeType;
mAdPreferredBitrate = adPreferredBitrate;
mIMAPlayer = new KIMAAdPlayer(context, adPlayerContainer, adUiContainer, mAdMimeType, mAdPreferredBitrate);
mIMAPlayer.setKIMAAdEventListener(this);
mDefaultAdTagUrl = adTagURL;
// Create an AdsLoader.
mSdkFactory = ImaSdkFactory.getInstance();
mAdsLoader = mSdkFactory.createAdsLoader(context);
mAdsLoader.addAdErrorListener(this);
mAdsLoader.addAdsLoadedListener(this);
}
/**
* Request video ads using the default VAST ad tag. Typically, you would change your ad tag
* URL based on the current content being played.
*/
public void requestAds(ContentProgressProvider contentProgressProvider) {
LOGD(TAG, "Start requestAds");
requestAds(mDefaultAdTagUrl, contentProgressProvider);
}
public void setListener(KIMAManagerListener listener) {
mListener = listener;
}
public void pause() {
if (mAdsManager != null) {
if (mIMAPlayer != null) {
mIMAPlayer.pauseAdCallback();
}
mAdsManager.pause();
}
}
public void resume() {
if (mAdsManager != null) {
if (mIMAPlayer != null) {
mIMAPlayer.resumeAdCallback();
}
mAdsManager.resume();
}
}
/**
* Request video ads from the given VAST ad tag.
* @param adTagUrl URL of the ad's VAST XML
*/
private void requestAds(String adTagUrl, ContentProgressProvider contentProgressProvider) {
LOGD(TAG, "Start requestAds adTagUrl = " + adTagUrl);
mAdDisplayContainer = mSdkFactory.createAdDisplayContainer();
mAdDisplayContainer.setPlayer(mIMAPlayer);
mAdDisplayContainer.setAdContainer(mIMAPlayer.getAdUIContainer());
// Create the ads request.
AdsRequest request = mSdkFactory.createAdsRequest();
request.setAdTagUrl(adTagUrl);
request.setAdDisplayContainer(mAdDisplayContainer);
request.setContentProgressProvider(contentProgressProvider);
// Request the ad. After the ad is loaded, onAdsManagerLoaded() will be called.
LOGD(TAG, "requestAds from IMA");
mAdsLoader.requestAds(request);
}
/**
* An event raised when ads are successfully loaded from the ad server via an AdsLoader.
*/
@Override
public void onAdsManagerLoaded(AdsManagerLoadedEvent adsManagerLoadedEvent) {
LOGD(TAG, "Start onAdsManagerLoaded");
// 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);
AdsRenderingSettings renderingSettings = ImaSdkFactory.getInstance().createAdsRenderingSettings();
List<String> mimeTypes = new ArrayList<>();
if (mAdMimeType == null) {
mimeTypes.add(KMediaFormat.mp4_clear.mimeType);
} else {
mimeTypes.add(mAdMimeType);
}
//mimeTypes.add("application/x-mpegURL");
//mimeTypes.add("video/mp4");
//mimeTypes.add("video/3gpp");
renderingSettings.setMimeTypes(mimeTypes);
renderingSettings.setUiElements(Collections.<UiElement>emptySet());
//Set<UiElement> set = new HashSet<UiElement>();
//set.add(UiElement.AD_ATTRIBUTION);
//set.add(UiElement.COUNTDOWN);
//renderingSettings.setUiElements(set);
LOGD(TAG, "Start mAdsManager.init");
mAdsManager.init(renderingSettings);
}
/**
* Responds to AdEvents.
*/
@Override
public void onAdEvent(AdEvent adEvent) {
LOGD(TAG, "Start onAdEvent " + adEvent.getType().name());
if (mListener != null) {
mListener.onAdEvent(adEvent.getType(), adJSONValue(adEvent));
}
}
/**
* An event raised when there is an error loading or playing ads.
*/
@Override
public void onAdError(AdErrorEvent adErrorEvent) {
LOGD(TAG, "Start onAdError");
String errMsg = "UNKNOWN ERROR";
if (adErrorEvent != null) {
errMsg = "Ad Error: " + adErrorEvent.getError().getErrorCode().name() + " - " + adErrorEvent.getError().getMessage();
}
LOGE(TAG, "IMA onAdError " + errMsg);
if (mListener != null) {
mListener.onAdError(errMsg);
}
}
private String adJSONValue(AdEvent adEvent) {
if (adEvent == null) {
return "(null)";
}
Ad ad = adEvent.getAd();
JSONObject jsonValue = null;
try {
jsonValue = new JSONObject();
switch (adEvent.getType()) {
case LOADED:
mAdsManager.start();
jsonValue.put(IsLinearKey, ad.isLinear());
jsonValue.put(AdIDKey, ad.getAdId());
jsonValue.put(AdSystemKey, "null");
jsonValue.put(AdPositionKey, ad.getAdPodInfo().getAdPosition());
break;
case COMPLETED:
jsonValue.put(AdIDKey, ad.getAdId());
break;
case CLICKED:
jsonValue.put(IsLinearKey, ad.isLinear());
break;
case SKIPPED:
jsonValue.put(IsLinearKey, ad.isLinear());
break;
}
} catch (Exception e) {
}
return jsonValue.toString();
}
/**
* Event raised by VideoPlayerWithAdPlayback when the content video is complete.
*/
public void contentComplete() {
mAdsLoader.contentComplete();
}
@Override
public void adDidProgress(float toTime, float totalTime) {
if (mListener != null) {
JSONObject jsonValue = null;
try {
jsonValue = new JSONObject();
jsonValue.put(TimeKey, toTime);
jsonValue.put(DurationKey, totalTime);
jsonValue.put(RemainKey, (totalTime - toTime));
mListener.onAdUpdateProgress(jsonValue.toString());
} catch (JSONException e) {
e.printStackTrace();
}
}
}
@Override
public void adDurationUpdate(float totalTime) {
JSONObject jsonValue = new JSONObject();
try {
jsonValue.put(DurationKey, totalTime);
mListener.onAdEvent(AdEvent.AdEventType.STARTED, jsonValue.toString());
} catch (JSONException e) {
e.printStackTrace();
}
}
public void destroy() {
if (mIMAPlayer != null) {
mIMAPlayer.release();
mIMAPlayer = null;
if (mAdsManager != null) {
mAdsManager.removeAdEventListener(this);
mAdsManager.destroy();
}
mListener = null;
}
}
}