#if UNITY_IOS //&& !UNITY_EDITOR using System; using System.Runtime.InteropServices; using Azerion.BlueStack.API; using Azerion.BlueStack.Internal; namespace Azerion.BlueStack.Platforms.iOS { public class InterstitialAdClient : IInterstitialAdClient, IDisposable { private IntPtr interstitialClientPtr; private IntPtr interstitialPtr; public InterstitialAdClient() { } #region interstitial ad callback types internal delegate void BSUOnInterstitialDidLoadedCallback(IntPtr interstitialClient); internal delegate void BSUOnInterstitialDidFailCallback(IntPtr interstitialClient, IntPtr error); internal delegate void BSUOnInterstitialClickedCallback(IntPtr interstitialClient); internal delegate void BSUOnInterstitialDisappearCallback(IntPtr interstitialClient); internal delegate void BSUOnInterstitialDidShownCallback(IntPtr interstitialClient); #endregion // This property should be used when setting the interstitialPtr. private IntPtr InterstitialPtr { get => this.interstitialPtr; set { Externs.BSURelease(this.interstitialPtr); this.interstitialPtr = value; } } public event EventHandler OnInterstitialDidLoaded; public event EventHandler OnInterstitialDidFail; public event EventHandler OnInterstitialClicked; public event EventHandler OnInterstitialDisappear; public event EventHandler OnInterstitialDidShown; public void Create(string placementId) { this.interstitialClientPtr = (IntPtr)GCHandle.Alloc(this); this.InterstitialPtr = Externs.BSUCreateInterstitialAd(this.interstitialClientPtr, placementId); Externs.BSUSetInterstitialAdCallbacks( this.InterstitialPtr, OnInterstitialDidLoadedCallback, OnInterstitialDidFailCallback, OnInterstitialClickedCallback, OnInterstitialDisappearCallback, OnInterstitialDidShownCallback); } public void Load() { Externs.BSULoadInterstitialAd(this.InterstitialPtr); } public void Load(IPreferenceClient iPreferenceClient) { PreferenceClient preferenceClient = (PreferenceClient)iPreferenceClient; Externs.BSULoadInterstitialAdWithRequestOptions(this.InterstitialPtr, preferenceClient.GetPreferenceClientPtr()); } public void Show() { Externs.BSUShowInterstitialAd(this.InterstitialPtr); } public void Destroy() { Externs.BSUDestroyInterstitialAd(this.InterstitialPtr); DestroyInterstitial(); } // Destroys the interstitial ad. public void DestroyInterstitial() { this.InterstitialPtr = IntPtr.Zero; } public void Dispose() { this.DestroyInterstitial(); ((GCHandle)this.interstitialClientPtr).Free(); } ~InterstitialAdClient() { this.Dispose(); } #region interstitial ad callback methods [AOT.MonoPInvokeCallback(typeof(BSUOnInterstitialDidLoadedCallback))] private static void OnInterstitialDidLoadedCallback(IntPtr interstitialClient) { InterstitialAdClient client = IntPtrToInterstitialAdClient(interstitialClient); if (client.OnInterstitialDidLoaded != null) { client.OnInterstitialDidLoaded(client, EventArgs.Empty); } } [AOT.MonoPInvokeCallback(typeof(BSUOnInterstitialDidFailCallback))] private static void OnInterstitialDidFailCallback(IntPtr interstitialClient, IntPtr error) { InterstitialAdClient client = IntPtrToInterstitialAdClient(interstitialClient); if (client.OnInterstitialDidFail != null) { client.OnInterstitialDidFail(client, BlueStackErrorUtils.CreateFromIntPtr(error)); } } [AOT.MonoPInvokeCallback(typeof(BSUOnInterstitialClickedCallback))] private static void OnInterstitialClickedCallback(IntPtr interstitialClient) { InterstitialAdClient client = IntPtrToInterstitialAdClient(interstitialClient); if (client.OnInterstitialClicked != null) { client.OnInterstitialClicked(client, EventArgs.Empty); } } [AOT.MonoPInvokeCallback(typeof(BSUOnInterstitialDisappearCallback))] private static void OnInterstitialDisappearCallback(IntPtr interstitialClient) { InterstitialAdClient client = IntPtrToInterstitialAdClient(interstitialClient); if (client.OnInterstitialDisappear != null) { client.OnInterstitialDisappear(client, EventArgs.Empty); } } [AOT.MonoPInvokeCallback(typeof(BSUOnInterstitialDidShownCallback))] private static void OnInterstitialDidShownCallback(IntPtr interstitialClient) { InterstitialAdClient client = IntPtrToInterstitialAdClient(interstitialClient); if (client.OnInterstitialDidShown != null) { client.OnInterstitialDidShown(client, EventArgs.Empty); } } private static InterstitialAdClient IntPtrToInterstitialAdClient( IntPtr interstitialClient) { GCHandle handle = (GCHandle)interstitialClient; return handle.Target as InterstitialAdClient; } #endregion } } #endif