package com.artemisoftnian.plugin;

import org.apache.cordova.CordovaPlugin;
import org.apache.cordova.CallbackContext;
import org.apache.cordova.PluginResult;
import org.apache.cordova.CordovaInterface;
import org.apache.cordova.CordovaWebView;

import org.json.JSONArray;
import org.json.JSONException;

import android.content.DialogInterface;
import android.util.Log;

//ADS
import com.unity3d.ads.IUnityAdsLoadListener;
import com.unity3d.ads.IUnityAdsShowListener;
import com.unity3d.ads.UnityAdsShowOptions;

//BANNER ADS
import com.unity3d.services.UnityAdsSDK;
import com.unity3d.services.banners.BannerView;
import com.unity3d.services.banners.BannerErrorInfo;
import com.unity3d.services.banners.UnityBannerSize;
import com.unity3d.ads.metadata.MetaData;

import com.unity3d.ads.UnityAds;
import com.unity3d.ads.IUnityAdsInitializationListener;

import android.view.View;
import android.view.ViewGroup;
import android.widget.RelativeLayout;
import android.content.Context;

import java.lang.reflect.Method;
import java.util.Objects;

public class UnityAds3 extends CordovaPlugin implements IUnityAdsInitializationListener{

	final UnityAdsShowListener unityAdsShowListener = new UnityAdsShowListener();
	final UnityBannerListener unityBannerListener = new UnityBannerListener();
	final UnityAdsLoadListener unityAdsLoadListener = new UnityAdsLoadListener();

    protected static final String TAG = "UnityAds3";
	protected CallbackContext context;

	protected String TEST_GAME_ID = "1700140"; // for arPlacement test use game id: 2085042
	protected String TEST_VIDEO_AD_PLACEMENT_ID = "video";
	protected String TEST_REWARDED_VIDEO_AD_PLACEMENT_ID = "rewardedVideo";
	protected String TEST_BANNER_AD_PLACEMENT_ID = "Banner";
	protected String TEST_AR_AD_PLACEMENT_ID = "arPlacement";
	protected String DEFAULT_REWARDED = "Android_Rewarded";
	protected String DEFAULT_INTERSTITIAL = "Android_Interstitial";

	protected String LAST_STATUS = "NOT_LOADED";
	protected String LAST_ERROR = "";

	private RelativeLayout bannerViewLayout;
	private BannerView bannerView;

	@Override
	public void initialize(CordovaInterface cordova, CordovaWebView webView) {
		super.initialize(cordova, webView);
	}
	
	@Override
	public void onPause(boolean multitasking) {
		super.onPause(multitasking);
	}
	
	@Override
	public void onResume(boolean multitasking) {
		super.onResume(multitasking);
	}

	@Override
	public void onDestroy() {
		super.onDestroy();
	}	

    @Override
    public boolean execute(final String action, final JSONArray args, final CallbackContext callbackContext) {
	   
		final UnityAds3 self = this;
		context = callbackContext;

		Log.d(TAG, String.format("%s, %s", "EXECUTE", action ) );
		Log.d(TAG, String.format("%s, %s", "ARGUMENTS: ", args ) );

		cordova.getActivity().runOnUiThread(() -> {
            switch (action) {
                case "UnityAdsInit":
					self.UnityAdsInit(args, callbackContext);
                    break;
                case "ShowVideoAd":
					self.ShowVideoAd(args,callbackContext);
                    break;
                case "ShowBannerAd":
					self.ShowBannerAd(args, callbackContext);
                    break;
                case "GetPlacementState":
					self.GetPlacementState(args, callbackContext);
					break;
				case "ManualGdprOpts":
					self.ManualGdprOpts(args, callbackContext);
					break;
				case "ManualCcpaOpts":
					self.ManualCcpaOpts(args, callbackContext);
					break;	
				case "ManualCustomAgeGates":
					self.ManualCustomAgeGates(args, callbackContext);
					break;
				case "GetUnityAdsSdkVersion":
					self.GetUnityAdsSdkVersion(args, callbackContext);
					break;													
                default:
                    callbackContext.error("Method not found");
                    break;
            }
        });
		return true;
	}

    private void UnityAdsInit(JSONArray args,  CallbackContext callbackContext){

		String gameId;
		boolean isTest;
		boolean isDebug;
		String privacyMode;

		context = callbackContext;

		Context activityContext = this.cordova.getActivity().getApplicationContext();
		
		try{
			gameId = args.getString(0);
			isTest = args.getBoolean(1);
			isDebug = args.getBoolean(2);
			privacyMode = args.getString(3);

		}catch(JSONException e){
			callbackContext.error(e.getMessage());
			return;
		}

		if(!UnityAds.isSupported()){
			callbackContext.error("Device not supported by UnityAds");
			return;
		}	

		if (gameId.equals("")){
			callbackContext.error("GameID Not Supplied");
			return;
		}

		if(gameId.equals("TEST")){
			gameId = TEST_GAME_ID;
		}

		if(UnityAds.isInitialized()){
			callbackContext.error("UnityAds already initialized");
			return;
		}

		
		//SET PRIVACY MODE BEFORE INITIALIZE
		if(!privacyMode.equals("none")){

			//app: This app is directed at children; no users will receive personalized ads.
			MetaData privModemetaData = new MetaData(activityContext);
			privModemetaData.set("privacy.mode", privacyMode);
			privModemetaData.commit();

			// mixed: This user will NOT receive personalized ads.
			if(privacyMode.equals("mixed")){
				MetaData userNonBehvmetaData = new MetaData(activityContext);
				userNonBehvmetaData.set("user.nonbehavioral", true);
				userNonBehvmetaData.commit();				
			}	
		}


		// Initialize UnityADS SDK:
		UnityAds.initialize(this.cordova.getActivity(), gameId, isTest, this);
		UnityAds.setDebugMode(isDebug);

		//UnityAds Banners
		PluginResult result = new PluginResult(PluginResult.Status.OK, String.format("[\"%s\",\"%s\"]", "UNITYADS", "INITIALIZING"));
		result.setKeepCallback(true);
		callbackContext.sendPluginResult(result);
	}

	private void ShowVideoAd(JSONArray args, CallbackContext callbackContext){
		
		String videoAdPlacementId;
		String msg;
		try{
			videoAdPlacementId = args.getString(0);
		}catch(JSONException e){
			callbackContext.error( "Invalid PlacementID" );
			return;
		}

		if(videoAdPlacementId.equals("")){
			callbackContext.error("PlacementID not specified");
			return;
		}
		
		if(videoAdPlacementId.equalsIgnoreCase("TEST")){
			videoAdPlacementId = TEST_VIDEO_AD_PLACEMENT_ID;
		}

		if(videoAdPlacementId.equalsIgnoreCase("TEST_REWARDED")){
			videoAdPlacementId = TEST_REWARDED_VIDEO_AD_PLACEMENT_ID;
		}

		if(videoAdPlacementId.equalsIgnoreCase("TEST_AR")){
			videoAdPlacementId = TEST_AR_AD_PLACEMENT_ID;
		}

		Log.d(TAG, videoAdPlacementId);

		if(UnityAds.isInitialized()){
			//UnityAds.show(this.cordova.getActivity(), videoAdPlacementId);
			UnityAds.load(videoAdPlacementId,unityAdsLoadListener);

			msg = String.format("[\"%s\",\"%s\"]", videoAdPlacementId, "READY");
		}else{
			msg = String.format("[\"%s\",\"%s\"]", videoAdPlacementId, "NOT_READY");
		}

		PluginResult result = new PluginResult(PluginResult.Status.OK, msg);
		result.setKeepCallback(true);
		callbackContext.sendPluginResult(result);
	}

	// Function taken from: http://www.java2s.com/example/java-src/pkg/com/cranberrygame/cordova/plugin/ad/admob/util-9a225.html
	public static View getView(CordovaWebView webView) {
		if (View.class.isAssignableFrom(CordovaWebView.class)) {
			return (View) webView;
		}

		try {
			Method getViewMethod = CordovaWebView.class.getMethod("getView", (Class<?>[]) null);
			if (getViewMethod != null) {
				Object[] args = {};
				return (View) getViewMethod.invoke(webView, args);
			}
		} catch (Exception ignored) {
		}

		return null;
	}

	private void ShowBannerAd(JSONArray args, CallbackContext callbackContext){
		
		String bannerAdPlacementId;
		String bannerPos;
		String msg;

		try{
			bannerAdPlacementId = args.getString(0);
			bannerPos = args.getString(1);
		}catch(JSONException e){
			callbackContext.error( "Invalid PlacementID" );
			return;
		}

		if(bannerAdPlacementId.equals("")){
			callbackContext.error("PlacementID not specified");
			return;
		}
		
		if(bannerAdPlacementId.equals("TEST")){
			bannerAdPlacementId = TEST_BANNER_AD_PLACEMENT_ID;
		}

		if(UnityAds.isInitialized()){

			//If not exist add the banner View layout
			if (bannerViewLayout == null) {
				bannerView = null;

				bannerViewLayout = new RelativeLayout(cordova.getActivity());
				RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT, RelativeLayout.LayoutParams.MATCH_PARENT);
				bannerViewLayout.setLayoutParams(params);

				((ViewGroup) Objects.requireNonNull(getView(webView))).addView(bannerViewLayout);
			}

			//If no banner showing add it to View if exist delete it.

			Log.d(TAG, String.format("%s %s", "BANNER POSITION:", bannerPos));

			if(bannerView == null){
				//Banner View Creation
				bannerView = new BannerView(this.cordova.getActivity(), bannerAdPlacementId, new UnityBannerSize(320, 50));
				bannerView.setListener(unityBannerListener);

				RelativeLayout.LayoutParams bannerParams = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT);

				switch (bannerPos) {
					case "TOP_LEFT":
						bannerParams.addRule(RelativeLayout.ALIGN_PARENT_TOP);
						bannerParams.addRule(RelativeLayout.ALIGN_PARENT_LEFT);
						break;
					case "TOP_CENTER":
						bannerParams.addRule(RelativeLayout.ALIGN_PARENT_TOP);
						bannerParams.addRule(RelativeLayout.CENTER_HORIZONTAL);
						break;
					case "TOP_RIGHT":
						bannerParams.addRule(RelativeLayout.ALIGN_PARENT_TOP);
						bannerParams.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);
						break;
					case "BOTTOM_LEFT":
						bannerParams.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM);
						bannerParams.addRule(RelativeLayout.ALIGN_PARENT_LEFT);
						break;
					case "BOTTOM_CENTER":
						bannerParams.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM);
						bannerParams.addRule(RelativeLayout.CENTER_HORIZONTAL);
						break;
					case "BOTTOM_RIGHT":
						bannerParams.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM);
						bannerParams.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);
						break;
					case "CENTER":
						bannerParams.addRule(RelativeLayout.CENTER_HORIZONTAL);
						bannerParams.addRule(RelativeLayout.CENTER_VERTICAL);
						break;
					default:
						callbackContext.error("Method not found");
						break;
				}

				bannerView.setLayoutParams(bannerParams);
				bannerView.load();

				bannerViewLayout.addView(bannerView);


			} else {
				bannerView.destroy();
				bannerView = null;
			}

			msg = String.format("[\"%s\",\"%s\"]", bannerAdPlacementId, "BANNER_READY");
		}else{
			msg = String.format("[\"%s\",\"%s\"]", bannerAdPlacementId, "UNITY ADS NOT READY YET");
		}

		PluginResult result = new PluginResult(PluginResult.Status.OK, msg);
		result.setKeepCallback(true);
		callbackContext.sendPluginResult(result);	

	}


	/**
	 * @param args Cordova Plugin Arguments
	 * @param callbackContext Cordova Context
	 *
	 * @deprecated  this functionality has being removed sens UnityAds SDK 4.0 <br/>
	 *              {will be removed in next version} <br/>
	 *              No direct replacement.
	 */
	@Deprecated
	private void GetPlacementState(JSONArray args, CallbackContext callbackContext)  {
		String videoAdPlacementId;
		String msg;

		try{
			videoAdPlacementId = args.getString(0);
		}catch(JSONException e){
			callbackContext.error( "Invalid PlacementID" );
			return;
		}
		Log.d(TAG, videoAdPlacementId);

		if(videoAdPlacementId.equalsIgnoreCase("TEST")){
			videoAdPlacementId = TEST_VIDEO_AD_PLACEMENT_ID;
		}

		if(videoAdPlacementId.equalsIgnoreCase("TEST_REWARDED")){
			videoAdPlacementId = TEST_REWARDED_VIDEO_AD_PLACEMENT_ID;
		}

		if(videoAdPlacementId.equalsIgnoreCase("TEST_AR")){
			videoAdPlacementId = TEST_AR_AD_PLACEMENT_ID;
		}

		//msg = String.format("[\"%s\",\"%s\"]", videoAdPlacementId, "DEPRECATED_FUNCTION_CALL");
		msg = String.format("[\"%s\",\"%s\"]", "LAST_STATE", LAST_STATUS);

		Log.d(TAG, String.format("%s", msg));

		PluginResult result = new PluginResult(PluginResult.Status.OK, msg);
		result.setKeepCallback(true);
		callbackContext.sendPluginResult(result);		

	}

	private void ManualGdprOpts(JSONArray args, CallbackContext callbackContext)  {

		boolean consent;
		String manualSetTo = "false";

		Context activityContext = this.cordova.getActivity().getApplicationContext();
		
		context = callbackContext;
		
		try{
			consent = args.getBoolean(0);
		}catch(JSONException e){
			callbackContext.error(e.getMessage());
			return;
		}		

		if(consent){
			manualSetTo = "true";
		}
		
		MetaData gdprMetaData = new MetaData(activityContext);
		gdprMetaData.set("gdpr.consent", manualSetTo );
		gdprMetaData.commit();

		MetaData userMetaData = new MetaData(activityContext);
		userMetaData.set("user.nonbehavioral", manualSetTo);
		userMetaData.commit();

		PluginResult result = new PluginResult(PluginResult.Status.OK, String.format("[\"%s\",\"%s\"]", "UNITYADS", manualSetTo));
		result.setKeepCallback(true);
		callbackContext.sendPluginResult(result);
	}

	private void ManualCcpaOpts(JSONArray args, CallbackContext callbackContext)  {

		boolean consent;
		String manualSetTo = "false";
		Context activityContext = this.cordova.getActivity().getApplicationContext();
		
		context = callbackContext;
		
		try{
			consent = args.getBoolean(0);
		}catch(JSONException e){
			callbackContext.error(e.getMessage());
			return;
		}		

		if(consent){
			manualSetTo = "true";
		}
		
		MetaData privacyMetaData = new MetaData(activityContext);
		privacyMetaData.set("privacy.consent", manualSetTo );
		privacyMetaData.commit();


		MetaData userMetaData = new MetaData(activityContext);
		userMetaData.set("user.nonbehavioral", manualSetTo);
		userMetaData.commit();

		PluginResult result = new PluginResult(PluginResult.Status.OK, String.format("[\"%s\",\"%s\"]", "UNITYADS", manualSetTo ));
		result.setKeepCallback(true);
		callbackContext.sendPluginResult(result);
	}

	private void ManualCustomAgeGates(JSONArray args, CallbackContext callbackContext)  {

		boolean useroveragelimit;
		String manualSetTo = "false";
		Context activityContext = this.cordova.getActivity().getApplicationContext();
		
		context = callbackContext;
		
		try{
			useroveragelimit = args.getBoolean(0);
		}catch(JSONException e){
			callbackContext.error(e.getMessage());
			return;
		}		

		if(useroveragelimit){
			manualSetTo = "true";
		}
		
		MetaData ageGateMetaData  = new MetaData(activityContext);
		ageGateMetaData.set("privacy.useroveragelimit", manualSetTo );
		ageGateMetaData.commit();


		MetaData userMetaData = new MetaData(activityContext);
		userMetaData.set("user.nonbehavioral", manualSetTo);
		userMetaData.commit();

		PluginResult result = new PluginResult(PluginResult.Status.OK, String.format("[\"%s\",\"%s\"]", "UNITYADS", manualSetTo ));
		result.setKeepCallback(true);
		callbackContext.sendPluginResult(result);
	}

	private void GetUnityAdsSdkVersion(JSONArray args, CallbackContext callbackContext){

		String msg = String.format("[\"%s\",\"%s\"]","UnityAdsSDK", UnityAds.getVersion());
		PluginResult result = new PluginResult(PluginResult.Status.OK, msg);
		result.setKeepCallback(true);
		callbackContext.sendPluginResult(result);	
	}

	@Override
	/* onInitializationComplete: */
	public void onInitializationComplete() {
		PluginResult result = new PluginResult(PluginResult.Status.OK, String.format("[\"%s\",\"%s\"]", "UNITYADS", "IS_READY"));
		result.setKeepCallback(true);
		context.sendPluginResult(result);
	}

	@Override
	/* onInitializationFailed: */
	public void onInitializationFailed(UnityAds.UnityAdsInitializationError error, String message) {

		String msg;

		Log.d(TAG, String.format("%s", "onInitializationFailed"));
		Log.d(TAG, String.format("%s", message));

		if(error == UnityAds.UnityAdsInitializationError.INTERNAL_ERROR){
			msg = String.format("[\"%s\",\"%s\"]", message, "INTERNAL_ERROR");
		}else if(error == UnityAds.UnityAdsInitializationError.INVALID_ARGUMENT){
			msg = String.format("[\"%s\",\"%s\"]", message, "INVALID_ARGUMENT");
		}else if(error == UnityAds.UnityAdsInitializationError.AD_BLOCKER_DETECTED){
			msg = String.format("[\"%s\",\"%s\"]", message, "AD_BLOCKER_DETECTED");
		}
		else{
			msg = String.format("[\"%s\",\"%s\"]", message, "UNKNOWN_ERROR");
		}

		PluginResult result = new PluginResult(PluginResult.Status.OK, msg);
		result.setKeepCallback(true);
		context.sendPluginResult(result);

	}

	/* UnityAdsLoadListener: */
	private class UnityAdsLoadListener implements IUnityAdsLoadListener {

		@Override
		public void onUnityAdsAdLoaded(String placementId) {
			Log.d(TAG, String.format("%s", "onUnityAdsAdLoaded"));
			Log.d(TAG, placementId);
			LAST_STATUS = "UNITY_ADS_LOADED";
			UnityAds.show(cordova.getActivity(), placementId, new UnityAdsShowOptions(), unityAdsShowListener);

			PluginResult result = new PluginResult(PluginResult.Status.OK, String.format("[\"%s\",\"%s\"]", placementId, "READY"));

			result.setKeepCallback(true);
			context.sendPluginResult(result);
		}

		@Override
		public void onUnityAdsFailedToLoad(String placementId, UnityAds.UnityAdsLoadError error, String message) {

			String msg;

			Log.d(TAG, String.format("%s", "onUnityAdsFailedToLoad"));
			Log.d(TAG, String.format("%s", message));

			if(error == UnityAds.UnityAdsLoadError.INITIALIZE_FAILED){
				msg = String.format("[\"%s\",\"%s\"]", message, "INITIALIZE_FAILED");
			}else if(error == UnityAds.UnityAdsLoadError.INTERNAL_ERROR){
				msg = String.format("[\"%s\",\"%s\"]", message, "INTERNAL_ERROR");
			}else if(error == UnityAds.UnityAdsLoadError.TIMEOUT){
				msg = String.format("[\"%s\",\"%s\"]", message, "TIMEOUT");
			}else if(error == UnityAds.UnityAdsLoadError.NO_FILL){
				msg = String.format("[\"%s\",\"%s\"]", message, "NO_FILL");
			}else if(error == UnityAds.UnityAdsLoadError.INVALID_ARGUMENT){
				msg = String.format("[\"%s\",\"%s\"]", message, "INVALID_ARGUMENT");
			}else{
				msg = String.format("[\"%s\",\"%s\"]", message, "UNKNOWN_ERROR");
			}

			PluginResult result = new PluginResult(PluginResult.Status.ERROR, msg);
			result.setKeepCallback(true);
			context.sendPluginResult(result);

		}
	}

	/* UnityAdsShowListener: */
	private class UnityAdsShowListener implements IUnityAdsShowListener{

		@Override
		public void onUnityAdsShowFailure(String placementId, UnityAds.UnityAdsShowError error, String message) {

			String msg;

			Log.d(TAG, String.format("%s", "onUnityAdsFailedToLoad"));
			Log.d(TAG, String.format("%s", message));

			if(error == UnityAds.UnityAdsShowError.INTERNAL_ERROR){
				msg = String.format("[\"%s\",\"%s\"]", message, "INTERNAL_ERROR");
				LAST_STATUS = "INTERNAL_ERROR";
			}else if(error == UnityAds.UnityAdsShowError.VIDEO_PLAYER_ERROR){
				msg = String.format("[\"%s\",\"%s\"]", message, "VIDEO_PLAYER_ERROR");
				LAST_STATUS = "VIDEO_PLAYER_ERROR";
			}else if(error == UnityAds.UnityAdsShowError.INVALID_ARGUMENT){
				msg = String.format("[\"%s\",\"%s\"]", message, "INVALID_ARGUMENT");
				LAST_STATUS = "INVALID_ARGUMENT";
			}else if(error == UnityAds.UnityAdsShowError.NOT_INITIALIZED){
				msg = String.format("[\"%s\",\"%s\"]", message, "NOT_INITIALIZED");
				LAST_STATUS = "NOT_INITIALIZED";
			}else if(error == UnityAds.UnityAdsShowError.ALREADY_SHOWING){
				msg = String.format("[\"%s\",\"%s\"]", message, "ALREADY_SHOWING");
				LAST_STATUS = "ALREADY_SHOWING";
			}else if(error == UnityAds.UnityAdsShowError.NO_CONNECTION){
				msg = String.format("[\"%s\",\"%s\"]", message, "NO_CONNECTION");
				LAST_STATUS = "NO_CONNECTION";
			}else if(error == UnityAds.UnityAdsShowError.NOT_READY){
				msg = String.format("[\"%s\",\"%s\"]", message, "NOT_READY");
				LAST_STATUS = "NOT_READY";
			}
			else{
				msg = String.format("[\"%s\",\"%s\"]", message, "UNKNOWN_ERROR");
				LAST_STATUS = "UNKNOWN_ERROR";
			}

			PluginResult result = new PluginResult(PluginResult.Status.ERROR, msg);
			result.setKeepCallback(true);
			context.sendPluginResult(result);

		}

		@Override
		public void onUnityAdsShowStart(String placementId) {

			Log.d(TAG, String.format("%s", "onUnityAdsShowStart"));
			Log.d(TAG, placementId);
			LAST_STATUS = "AD_SHOWING";

			PluginResult result = new PluginResult(PluginResult.Status.OK, String.format("[\"%s\",\"%s\"]", placementId, "SHOWING"));
			result.setKeepCallback(true);
			context.sendPluginResult(result);
		}

		@Override
		public void onUnityAdsShowClick(String placementId) {

			Log.d(TAG, String.format("%s", "onUnityAdsShowClick"));
			Log.d(TAG, placementId);
			LAST_STATUS = "AD_CLICKED";

			PluginResult result = new PluginResult(PluginResult.Status.OK, String.format("[\"%s\",\"%s\"]", placementId, "AD_CLICKED"));
			result.setKeepCallback(true);
			context.sendPluginResult(result);
		}

		@Override
		public void onUnityAdsShowComplete(String placementId, UnityAds.UnityAdsShowCompletionState state) {

			String msg = "";

			if(state == UnityAds.UnityAdsShowCompletionState.COMPLETED){
				msg = String.format("[\"%s\",\"%s\"]", placementId, "COMPLETED");
				LAST_STATUS = "AD_COMPLETED";
			}else if(state == UnityAds.UnityAdsShowCompletionState.SKIPPED){
				msg = String.format("[\"%s\",\"%s\"]", placementId, "SKIPPED");
				LAST_STATUS = "AD_SKIPPED";
			}

			Log.d(TAG, String.format("%s", "onUnityAdsFinish"));
			Log.d(TAG, msg);

			PluginResult result = new PluginResult(PluginResult.Status.OK, msg);
			context.sendPluginResult(result);
		}
	}

	/* UnityBannerListener: */
	private class UnityBannerListener implements BannerView.IListener {

		@Override
		public void onBannerLoaded(BannerView bannerAdView) {
			// When the banner content loads, add it to the view hierarchy:
			Log.d(TAG, String.format("%s", "onUnityBannerLoaded, banner placed"));

			LAST_STATUS = "AD_LOADED";
			PluginResult result = new PluginResult(PluginResult.Status.OK, String.format("[\"%s\",\"%s\"]", "UNITYADS", "AD_LOADED"));
			result.setKeepCallback(true);
			context.sendPluginResult(result);
		}


        @Override
		public void onBannerFailedToLoad(BannerView bannerAdView, BannerErrorInfo errorInfo) {
            Log.d("SupportTest", "Banner Error" + errorInfo.errorMessage);
			
			Log.d(TAG, String.format("%s", "onBannerFailedToLoad"));
			Log.d(TAG, String.format("%s, %s", "banner error msg:", errorInfo.errorMessage));
			LAST_STATUS = errorInfo.errorMessage;

			PluginResult result = new PluginResult(PluginResult.Status.OK, errorInfo.errorMessage);
			result.setKeepCallback(true);
			context.sendPluginResult(result);				
        }

        @Override
        public void onBannerClick(BannerView bannerAdView) {
			// Called when a banner is clicked.
			LAST_STATUS = "BANNER_CLICKED";
			Log.d(TAG, String.format("%s", "onBannerClick, Banner Clicked"));
			bannerAdView.destroy();
			bannerView = null;
        }

        @Override
        public void onBannerLeftApplication(BannerView bannerAdView) {
			// Called when the banner links out of the application.
			LAST_STATUS = "BANNER_LEFT_APPLICATION";
			Log.d(TAG, String.format("%s", "onBannerLeftApplication, Banner Left Application"));	
        }

		@Override
		public void onBannerShown(BannerView bannerAdView){
			// Called when the banner links out of the application.
			LAST_STATUS = "BANNER_SHOWN";
			Log.d(TAG, String.format("%s", "onBannerShown, Banner Shown"));
		}

	}


}