//Copyright (c) 2014 Sang Ki Kwon (Cranberrygame)
//Email: cranberrygame@yahoo.com
//Homepage: http://cranberrygame.github.io
//License: MIT (http://opensource.org/licenses/MIT)
using System;
using System.Windows;
using System.Runtime.Serialization;
using WPCordovaClassLib;
using WPCordovaClassLib.Cordova;
using WPCordovaClassLib.Cordova.Commands;
using WPCordovaClassLib.Cordova.JSON;
using System.Windows.Controls;
using Microsoft.Phone.Controls;
using System.Diagnostics; //Debug.WriteLine
//
using GoogleAds;
namespace Test {
public class AdmobOverlap : PluginDelegate
{
protected Plugin plugin;
//
protected string bannerAdUnit;
protected string interstitialAdUnit;
protected bool isOverlap;
protected bool isTest;
//
protected string bannerPreviousPosition;
protected string bannerPreviousSize;
protected int lastOrientation;
//
protected bool bannerAdPreload;
protected bool fullScreenAdPreload;
//admob
protected AdView bannerView;
protected InterstitialAd interstitialView;
public AdmobOverlap(Plugin plugin_)
{
plugin = plugin_;
}
public void _setLicenseKey(string email, string licenseKey) {
}
public void _setUp(string bannerAdUnit, string interstitialAdUnit, bool isOverlap, bool isTest)
{
this.bannerAdUnit = bannerAdUnit;
this.interstitialAdUnit = interstitialAdUnit;
this.isOverlap = isOverlap;
this.isTest = isTest;
}
public void _preloadBannerAd()
{
bannerAdPreload = true;
_hideBannerAd();
loadBannerAd();
}
private void loadBannerAd()
{
if (bannerView == null)
{
if (bannerPreviousSize == null)
{
//bannerPreviousSize = "SMART_BANNER";
bannerPreviousSize = "BANNER";
}
//
AdFormats format = AdFormats.Banner;
//https://developers.google.com/mobile-ads-sdk/docs/admob/wp/banner
if (bannerPreviousSize.Equals("BANNER"))
{
format = AdFormats.Banner;//Banner (320x50, Phones and Tablets)
}
else if (bannerPreviousSize.Equals("SMART_BANNER"))
{
format = AdFormats.SmartBanner;//Smart banner (Auto size, Phones and Tablets) //https://developers.google.com/mobile-ads-sdk/docs/admob/android/banner#smart
}
else {
format = AdFormats.SmartBanner;
}
//
bannerView = new AdView
{
//Format = AdFormats.Banner,
//Format = AdFormats.SmartBanner,
Format = format,
AdUnitID = this.bannerAdUnit
};
bannerView.ReceivedAd += bannerView_ReceivedAd;
bannerView.FailedToReceiveAd += bannerView_FailedToReceiveAd;
bannerView.ShowingOverlay += bannerView_ShowingOverlay;
bannerView.LeavingApplication += bannerView_LeavingApplicationAd;
bannerView.DismissingOverlay += bannerView_DismissingOverlay;
}
AdRequest adRequest = new AdRequest();
if(isTest)
{
adRequest.ForceTesting = true;
}
bannerView.LoadAd(adRequest);
}
public void _showBannerAd(string position, string size)
{
if (bannerIsShowingOverlap() && position.Equals(this.bannerPreviousPosition) && size.Equals(this.bannerPreviousSize))
{
return;
}
this.bannerPreviousPosition = position;
this.bannerPreviousSize = size;
if (bannerAdPreload)
{
bannerAdPreload = false;
}
else
{
_hideBannerAd();
loadBannerAd();
}
addBannerViewOverlap(position, size);
PluginResult pr = new PluginResult(PluginResult.Status.OK, "onBannerAdShown");
pr.KeepCallback = true;
plugin.DispatchCommandResult(pr);
//PluginResult pr = new PluginResult(PluginResult.Status.ERROR);
//pr.KeepCallback = true;
//plugin.DispatchCommandResult(pr);
}
protected virtual bool bannerIsShowingOverlap()
{
bool bannerIsShowing = false;
if (bannerView != null)
{
PhoneApplicationFrame rootFrame = Application.Current.RootVisual as PhoneApplicationFrame;
PhoneApplicationPage rootPage = rootFrame.Content as PhoneApplicationPage;
Grid rootGrid = rootPage.FindName("LayoutRoot") as Grid;
//rootGrid.ShowGridLines = true;
CordovaView rootView = rootPage.FindName("CordovaView") as CordovaView;
if (rootGrid.Children.Contains(bannerView))
bannerIsShowing = true;
}
return bannerIsShowing;
}
protected virtual void addBannerViewOverlap(String position, String size)
{
/*
//D:\share\cordova_test\testapp\platforms\wp8\MainPage.xaml
//D:\share\cordova_test\testapp\platforms\wp8\MainPage.xaml.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using Microsoft.Phone.Controls;
using System.IO;
using System.Windows.Media.Imaging;
using System.Windows.Resources;
namespace com.cranberrygame.adrotatortest
{
public partial class MainPage : PhoneApplicationPage
{
// Constructor
public MainPage()
{
InitializeComponent();
this.CordovaView.Loaded += CordovaView_Loaded;
}
private void CordovaView_Loaded(object sender, RoutedEventArgs e)
{
this.CordovaView.Loaded -= CordovaView_Loaded;
}
}
}
//D:\share\cordova_test\testapp\platforms\wp8\MainPage.xaml
*/
if (position.Equals("top-left"))
{
bannerView.VerticalAlignment = VerticalAlignment.Top;
bannerView.HorizontalAlignment = HorizontalAlignment.Left;
}
else if (position.Equals("top-center"))
{
bannerView.VerticalAlignment = VerticalAlignment.Top;
bannerView.HorizontalAlignment = HorizontalAlignment.Center;
}
else if (position.Equals("top-right"))
{
bannerView.VerticalAlignment = VerticalAlignment.Top;
bannerView.HorizontalAlignment = HorizontalAlignment.Right;
}
else if (position.Equals("left"))
{
bannerView.VerticalAlignment = VerticalAlignment.Center;
bannerView.HorizontalAlignment = HorizontalAlignment.Left;
}
else if (position.Equals("center"))
{
bannerView.VerticalAlignment = VerticalAlignment.Center;
bannerView.HorizontalAlignment = HorizontalAlignment.Center;
}
else if (position.Equals("right"))
{
bannerView.VerticalAlignment = VerticalAlignment.Center;
bannerView.HorizontalAlignment = HorizontalAlignment.Right;
}
else if (position.Equals("bottom-left"))
{
bannerView.VerticalAlignment = VerticalAlignment.Bottom;
bannerView.HorizontalAlignment = HorizontalAlignment.Left;
}
else if (position.Equals("bottom-center"))
{
bannerView.VerticalAlignment = VerticalAlignment.Bottom;
bannerView.HorizontalAlignment = HorizontalAlignment.Center;
}
else if (position.Equals("bottom-right"))
{
bannerView.VerticalAlignment = VerticalAlignment.Bottom;
bannerView.HorizontalAlignment = HorizontalAlignment.Right;
}
else
{
bannerView.VerticalAlignment = VerticalAlignment.Top;
bannerView.HorizontalAlignment = HorizontalAlignment.Center;
}
PhoneApplicationFrame rootFrame = Application.Current.RootVisual as PhoneApplicationFrame;
PhoneApplicationPage rootPage = rootFrame.Content as PhoneApplicationPage;
Grid rootGrid = rootPage.FindName("LayoutRoot") as Grid;
//rootGrid.ShowGridLines = true;
CordovaView rootView = rootPage.FindName("CordovaView") as CordovaView;
rootGrid.Children.Add(bannerView);
}
public void _reloadBannerAd()
{
loadBannerAd();
}
public void _hideBannerAd()
{
removeBannerViewOverlap();
PluginResult pr = new PluginResult(PluginResult.Status.OK, "onBannerAdHidden");
pr.KeepCallback = true;
plugin.DispatchCommandResult(pr);
//PluginResult pr = new PluginResult(PluginResult.Status.ERROR);
//pr.KeepCallback = true;
//plugin.DispatchCommandResult(pr);
}
protected virtual void removeBannerViewOverlap()
{
if (bannerView == null)
return;
PhoneApplicationFrame rootFrame = Application.Current.RootVisual as PhoneApplicationFrame;
PhoneApplicationPage rootPage = rootFrame.Content as PhoneApplicationPage;
Grid rootGrid = rootPage.FindName("LayoutRoot") as Grid;
//rootGrid.ShowGridLines = true;
CordovaView rootView = rootPage.FindName("CordovaView") as CordovaView;
if (rootGrid.Children.Contains(bannerView))
{
rootGrid.Children.Remove(bannerView);
}
}
public void _preloadInterstitialAd()
{
fullScreenAdPreload = true;
loadinterstitialAd();
}
protected void loadinterstitialAd()
{
//if (interstitialView == null) //need to comment on wp8
//{
//interstitialView = new InterstitialAd("ca-app-pub-4906074177432504/4879304879");//x cf) wp8
//interstitialView = new InterstitialAd("ca-app-pub-4906074177432504/5150650074");//o cf) android
interstitialView = new InterstitialAd(this.interstitialAdUnit);
//http://forums.xamarin.com/discussion/849/binding-library-for-inneractive-sdk
interstitialView.ReceivedAd += interstitialView_ReceivedAd;
interstitialView.FailedToReceiveAd += interstitialView_FailedToReceiveAd;
interstitialView.ShowingOverlay += interstitialView_ShowingOverlay;
interstitialView.DismissingOverlay += interstitialView_DismissingOverlay;
//}
AdRequest adRequest = new AdRequest();
if(isTest)
{
adRequest.ForceTesting = true;
}
interstitialView.LoadAd(adRequest);
}
public void _showInterstitialAd()
{
if (fullScreenAdPreload)
{
fullScreenAdPreload = false;
//An exception of type 'System.NullReferenceException' occurred in GoogleAds.DLL and wasn't handled before a managed/native boundary
try
{
interstitialView.ShowAd();
}
catch (Exception ex)
{
Debug.WriteLine(ex.Message);
}
}
else
{
loadinterstitialAd();
}
}
protected void bannerView_ReceivedAd(object sender, AdEventArgs e)
{
Debug.WriteLine("BannerView_ReceivedAd");
PluginResult pr;
if (bannerAdPreload)
{
pr = new PluginResult(PluginResult.Status.OK, "onBannerAdPreloaded");
pr.KeepCallback = true;
plugin.DispatchCommandResult(pr);
//PluginResult pr = new PluginResult(PluginResult.Status.ERROR);
//pr.KeepCallback = true;
//plugin.DispatchCommandResult(pr);
}
pr = new PluginResult(PluginResult.Status.OK, "onBannerAdLoaded");
pr.KeepCallback = true;
plugin.DispatchCommandResult(pr);
//PluginResult pr = new PluginResult(PluginResult.Status.ERROR);
//pr.KeepCallback = true;
//plugin.DispatchCommandResult(pr);
}
protected void bannerView_FailedToReceiveAd(object sender, AdErrorEventArgs errorCode)
{
Debug.WriteLine("BannerView_FailedToReceiveAd " + errorCode.ErrorCode);
}
protected void bannerView_ShowingOverlay(object sender, AdEventArgs e)
{
Debug.WriteLine("BannerView_ShowingOverlay");//click and ad opened //onBannerAdShown x
}
protected void bannerView_LeavingApplicationAd(object sender, AdEventArgs args)
{
Debug.WriteLine("bannerView_LeavingApplicationAd");
}
protected void bannerView_DismissingOverlay(object sender, AdEventArgs e)
{
Debug.WriteLine("BannerView_DismissingOverlay");//onBannerAdHidden x
}
protected void interstitialView_ReceivedAd(object sender, AdEventArgs e)
{
Debug.WriteLine("interstitialView_ReceivedAd");
PluginResult pr;
if (fullScreenAdPreload)
{
pr = new PluginResult(PluginResult.Status.OK, "onInterstitialAdPreloaded");
pr.KeepCallback = true;
plugin.DispatchCommandResult(pr);
//PluginResult pr = new PluginResult(PluginResult.Status.ERROR);
//pr.KeepCallback = true;
//plugin.DispatchCommandResult(pr);
}
pr = new PluginResult(PluginResult.Status.OK, "onInterstitialAdLoaded");
pr.KeepCallback = true;
plugin.DispatchCommandResult(pr);
//PluginResult pr = new PluginResult(PluginResult.Status.ERROR);
//pr.KeepCallback = true;
//plugin.DispatchCommandResult(pr);
if (!fullScreenAdPreload)
{
interstitialView.ShowAd();
}
}
protected void interstitialView_FailedToReceiveAd(object sender, AdErrorEventArgs errorCode)
{
Debug.WriteLine("interstitialView_FailedToReceiveAd " + errorCode.ErrorCode);
}
protected void interstitialView_ShowingOverlay(object sender, AdEventArgs e)
{
Debug.WriteLine("OnInterstitialViewPresentScreen");
PluginResult pr = new PluginResult(PluginResult.Status.OK, "onInterstitialAdShown");
pr.KeepCallback = true;
plugin.DispatchCommandResult(pr);
//PluginResult pr = new PluginResult(PluginResult.Status.ERROR);
//pr.KeepCallback = true;
//plugin.DispatchCommandResult(pr);
}
protected void interstitialView_DismissingOverlay(object sender, AdEventArgs e)
{
Debug.WriteLine("interstitialView_DismissingOverlay");
PluginResult pr = new PluginResult(PluginResult.Status.OK, "onInterstitialAdHidden");
pr.KeepCallback = true;
plugin.DispatchCommandResult(pr);
//PluginResult pr = new PluginResult(PluginResult.Status.ERROR);
//pr.KeepCallback = true;
//plugin.DispatchCommandResult(pr);
}
}
}