#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 RewardedVideoAdClient : IRewardedVideoAdClient, IDisposable { private IntPtr _rewardedClientPtr; private IntPtr _rewardedPtr; #region rewarded ad callback types internal delegate void BSUOnRewardedVideoLoadedCallback(IntPtr rewardedClient); internal delegate void BSUOnRewardedVideoErrorCallback(IntPtr rewardedClient, IntPtr error); internal delegate void BSUOnRewardedVideoClickedCallback(IntPtr rewardedClient); internal delegate void BSUOnRewardedVideoClosedCallback(IntPtr rewardedClient); internal delegate void BSUOnRewardedVideoAppearedCallback(IntPtr rewardedClient); internal delegate void BSUOnUserRewardEarnedCallback(IntPtr rewardedClient, string rewardType, int rewardAmount); #endregion // This property should be used when setting the rewardedPtr. private IntPtr RewardedPtr { get => this._rewardedPtr; set { Externs.BSURelease(this._rewardedPtr); this._rewardedPtr = value; } } public event EventHandler OnRewardedVideoLoaded; public event EventHandler OnRewardedVideoError; public event EventHandler OnRewardedVideoClicked; public event EventHandler OnRewardedVideoClosed; public event EventHandler OnRewardedVideoAppeared; public event EventHandler OnUserRewardEarned; public void Create(string placementId) { this._rewardedClientPtr = (IntPtr)GCHandle.Alloc(this); this.RewardedPtr = Externs.BSUCreateRewardedVideoAd(this._rewardedClientPtr, placementId); Externs.BSUSetRewardedVideoAdCallbacks( this.RewardedPtr, OnRewardedVideoLoadedCallback, OnRewardedVideoErrorCallback, OnRewardedVideoClickedCallback, OnRewardedVideoClosedCallback, OnRewardedVideoAppearedCallback, OnUserRewardEarnedCallback); } public void Load() { Externs.BSULoadRewardedVideoAd(this.RewardedPtr); } public void Load(IPreferenceClient iPreferenceClient) { PreferenceClient preferenceClient = (PreferenceClient)iPreferenceClient; Externs.BSULoadRewardedVideoAdWithRequestOptions(this.RewardedPtr, preferenceClient.GetPreferenceClientPtr()); } public void Show() { Externs.BSUShowRewardedVideoAd(this.RewardedPtr); } public void Destroy() { Externs.BSUDestroyRewardedVideoAd(this.RewardedPtr); DestroyRewarded(); } // Destroys the rewarded video ad. private void DestroyRewarded() { this.RewardedPtr = IntPtr.Zero; } public void Dispose() { this.DestroyRewarded(); ((GCHandle)this._rewardedClientPtr).Free(); } ~RewardedVideoAdClient() { this.Dispose(); } #region rewarded video ad callback methods [AOT.MonoPInvokeCallback(typeof(BSUOnRewardedVideoLoadedCallback))] private static void OnRewardedVideoLoadedCallback(IntPtr rewardedClient) { RewardedVideoAdClient client = IntPtrToRewardedVideoAdClient(rewardedClient); if (client.OnRewardedVideoLoaded != null) { client.OnRewardedVideoLoaded(client, EventArgs.Empty); } } [AOT.MonoPInvokeCallback(typeof(BSUOnRewardedVideoErrorCallback))] private static void OnRewardedVideoErrorCallback(IntPtr rewardedClient, IntPtr error) { RewardedVideoAdClient client = IntPtrToRewardedVideoAdClient(rewardedClient); if (client.OnRewardedVideoError != null) { client.OnRewardedVideoError(client, BlueStackErrorUtils.CreateFromIntPtr(error)); } } [AOT.MonoPInvokeCallback(typeof(BSUOnRewardedVideoClickedCallback))] private static void OnRewardedVideoClickedCallback(IntPtr rewardedClient) { RewardedVideoAdClient client = IntPtrToRewardedVideoAdClient(rewardedClient); if (client.OnRewardedVideoClicked != null) { client.OnRewardedVideoClicked(client, EventArgs.Empty); } } [AOT.MonoPInvokeCallback(typeof(BSUOnRewardedVideoClosedCallback))] private static void OnRewardedVideoClosedCallback(IntPtr rewardedClient) { RewardedVideoAdClient client = IntPtrToRewardedVideoAdClient(rewardedClient); if (client.OnRewardedVideoClosed != null) { client.OnRewardedVideoClosed(client, EventArgs.Empty); } } [AOT.MonoPInvokeCallback(typeof(BSUOnRewardedVideoAppearedCallback))] private static void OnRewardedVideoAppearedCallback(IntPtr rewardedClient) { RewardedVideoAdClient client = IntPtrToRewardedVideoAdClient(rewardedClient); if (client.OnRewardedVideoAppeared != null) { client.OnRewardedVideoAppeared(client, EventArgs.Empty); } } [AOT.MonoPInvokeCallback(typeof(BSUOnUserRewardEarnedCallback))] private static void OnUserRewardEarnedCallback(IntPtr rewardedClient, string rewardType, int rewardAmount) { RewardedVideoAdClient client = IntPtrToRewardedVideoAdClient(rewardedClient); if (client.OnUserRewardEarned != null) { RewardedItem rewardArg = new RewardedItem(rewardAmount, rewardType); client.OnUserRewardEarned(client, e: rewardArg); } } private static RewardedVideoAdClient IntPtrToRewardedVideoAdClient( IntPtr rewardedClient) { GCHandle handle = (GCHandle)rewardedClient; return handle.Target as RewardedVideoAdClient; } #endregion } } #endif