#if UNITY_IOS //&& !UNITY_EDITOR using System; using System.Runtime.InteropServices; using Azerion.BlueStack.API; using Azerion.BlueStack.API.Banner; using Azerion.BlueStack.Internal; namespace Azerion.BlueStack.Platforms.iOS { public class BannerAdClient : IBannerAdClient, IDisposable { private IntPtr _bannerAdPtr; private IntPtr _bannerAdClientPtr; private IBannerAdClient _bannerAdClient; #region BannerAd callback types internal delegate void BSUOnBannerDidLoadCallback(IntPtr bannerClient); internal delegate void BSUOnBannerDidFailedCallback(IntPtr bannerClient, IntPtr error); internal delegate void BSUOnAdClickedCallback(IntPtr bannerClient); internal delegate void BSUOnBannerDidRefreshCallback(IntPtr bannerClient); internal delegate void BSUOnBannerDidFailToRefreshCallback(IntPtr bannerClient, IntPtr error); internal delegate void BSUOnBannerHideCallback(IntPtr bannerClient); internal delegate void BSUOnBannerDisplayCallback(IntPtr bannerClient); #endregion // This property should be used when setting the bannerViewPtr. private IntPtr BannerAdPtr { get => this._bannerAdPtr; set { Externs.BSURelease(this._bannerAdPtr); this._bannerAdPtr = value; } } #region Banner callback methods [AOT.MonoPInvokeCallback(typeof(BSUOnBannerDidLoadCallback))] private static void OnBannerDidLoadCallback(IntPtr bannerClient) { BannerAdClient client = IntPtrToBannerAdClient(bannerClient); if (client.OnBannerDidLoad != null) { client.OnBannerDidLoad(client, EventArgs.Empty); } } [AOT.MonoPInvokeCallback(typeof(BSUOnBannerDidFailedCallback))] private static void OnBannerDidFailedCallback(IntPtr bannerClient, IntPtr error) { BannerAdClient client = IntPtrToBannerAdClient(bannerClient); if (client.OnBannerDidFailed != null) { client.OnBannerDidFailed(client, BlueStackErrorUtils.CreateFromIntPtr(error)); } } [AOT.MonoPInvokeCallback(typeof(BSUOnAdClickedCallback))] private static void OnAdClickedCallback(IntPtr bannerClient) { BannerAdClient client = IntPtrToBannerAdClient(bannerClient); if (client.OnAdClicked != null) { client.OnAdClicked(client, EventArgs.Empty); } } [AOT.MonoPInvokeCallback(typeof(BSUOnBannerDidRefreshCallback))] private static void OnBannerDidRefreshCallback(IntPtr bannerClient) { BannerAdClient client = IntPtrToBannerAdClient(bannerClient); if (client.OnBannerDidRefresh != null) { client.OnBannerDidRefresh(client, EventArgs.Empty); } } [AOT.MonoPInvokeCallback(typeof(BSUOnBannerDidFailToRefreshCallback))] private static void OnBannerDidFailToRefreshCallback(IntPtr bannerClient, IntPtr error) { BannerAdClient client = IntPtrToBannerAdClient(bannerClient); if (client.OnBannerDidFailToRefresh != null) { client.OnBannerDidFailToRefresh(client, BlueStackErrorUtils.CreateFromIntPtr(error)); } } [AOT.MonoPInvokeCallback(typeof(BSUOnBannerHideCallback))] private static void OnBannerHideCallback(IntPtr bannerClient) { BannerAdClient client = IntPtrToBannerAdClient(bannerClient); if (client.OnBannerHide != null) { client.OnBannerHide(client, EventArgs.Empty); } } [AOT.MonoPInvokeCallback(typeof(BSUOnBannerDisplayCallback))] private static void OnBannerDisplayCallback(IntPtr bannerClient) { BannerAdClient client = IntPtrToBannerAdClient(bannerClient); if (client.OnBannerDisplay != null) { client.OnBannerDisplay(client, EventArgs.Empty); } } private static BannerAdClient IntPtrToBannerAdClient(IntPtr bannerClient) { GCHandle handle = (GCHandle)bannerClient; return handle.Target as BannerAdClient; } #endregion public void Destroy() { this.DestroyBannerAd(); } public void SetPosition(AdPosition adPosition) { Externs.BSUSetBannerAdPosition(this.BannerAdPtr, (int)adPosition); } // Destroys the banner ad. private void DestroyBannerAd() { Externs.BSUDestroyBannerAd(this.BannerAdPtr); this.BannerAdPtr = IntPtr.Zero; } public void Dispose() { this.DestroyBannerAd(); ((GCHandle)this._bannerAdClientPtr).Free(); } ~BannerAdClient() { this.Dispose(); } public event EventHandler OnBannerDidLoad; public event EventHandler OnBannerDidFailed; public event EventHandler OnAdClicked; public event EventHandler OnBannerDidRefresh; public event EventHandler OnBannerDidFailToRefresh; public event EventHandler OnBannerHide; public event EventHandler OnBannerDisplay; public void CreateBannerAd(string placementId, AdPosition adPosition) { this._bannerAdClientPtr = (IntPtr)GCHandle.Alloc(this); this.BannerAdPtr = Externs.BSUCreateBannerAd( this._bannerAdClientPtr, placementId, (int)adPosition); Externs.BSUSetBannerAdCallbacks( this.BannerAdPtr, OnBannerDidLoadCallback, OnBannerDidFailedCallback, OnAdClickedCallback, OnBannerDidRefreshCallback, OnBannerDidFailToRefreshCallback, OnBannerHideCallback, OnBannerDisplayCallback ); } public void Load(AdSize adSize) { Externs.BSULoadBannerAd(this.BannerAdPtr, adSize.Size); } public void Load(AdSize adSize, IPreferenceClient iPreferenceClient) { PreferenceClient preferenceClient = (PreferenceClient)iPreferenceClient; Externs.BSULoadBannerAdWithRequestOptions(this.BannerAdPtr, adSize.Size, preferenceClient.GetPreferenceClientPtr()); } public void Show() { Externs.BSUShowBannerAd(this.BannerAdPtr); } public void Hide() { Externs.BSUHideBannerAd(this.BannerAdPtr); } } } #endif