// Copyright (C) 2015 Google, Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #if UNITY_IOS using System; using System.Collections.Generic; using System.Runtime.InteropServices; using UnityEngine; using GoogleMobileAds.Api; using GoogleMobileAds.Common; namespace GoogleMobileAds.iOS { public class RewardBasedVideoAdClient : IRewardBasedVideoAdClient, IDisposable { private IntPtr rewardBasedVideoAdPtr; private IntPtr rewardBasedVideoAdClientPtr; #region reward based video callback types internal delegate void GADURewardBasedVideoAdDidReceiveAdCallback( IntPtr rewardBasedVideoAdClient); internal delegate void GADURewardBasedVideoAdDidFailToReceiveAdWithErrorCallback( IntPtr rewardBasedVideoClient, string error); internal delegate void GADURewardBasedVideoAdDidOpenCallback( IntPtr rewardBasedVideoAdClient); internal delegate void GADURewardBasedVideoAdDidStartCallback( IntPtr rewardBasedVideoAdClient); internal delegate void GADURewardBasedVideoAdDidCloseCallback( IntPtr rewardBasedVideoAdClient); internal delegate void GADURewardBasedVideoAdDidRewardCallback( IntPtr rewardBasedVideoAdClient, string rewardType, double rewardAmount); internal delegate void GADURewardBasedVideoAdWillLeaveApplicationCallback( IntPtr rewardBasedVideoAdClient); internal delegate void GADURewardBasedVideoAdDidCompleteCallback( IntPtr rewardBasedVideoAdClient); #endregion public event EventHandler OnAdLoaded; public event EventHandler OnAdFailedToLoad; public event EventHandler OnAdOpening; public event EventHandler OnAdStarted; public event EventHandler OnAdClosed; public event EventHandler OnAdRewarded; public event EventHandler OnAdLeavingApplication; public event EventHandler OnAdCompleted; // This property should be used when setting the rewardBasedVideoPtr. private IntPtr RewardBasedVideoAdPtr { get { return this.rewardBasedVideoAdPtr; } set { Externs.GADURelease(this.rewardBasedVideoAdPtr); this.rewardBasedVideoAdPtr = value; } } #region IGoogleMobileAdsRewardBasedVideoClient implementation // Creates a reward based video. public void CreateRewardBasedVideoAd() { this.rewardBasedVideoAdClientPtr = (IntPtr)GCHandle.Alloc(this); this.RewardBasedVideoAdPtr = Externs.GADUCreateRewardBasedVideoAd( this.rewardBasedVideoAdClientPtr); Externs.GADUSetRewardBasedVideoAdCallbacks( this.RewardBasedVideoAdPtr, RewardBasedVideoAdDidReceiveAdCallback, RewardBasedVideoAdDidFailToReceiveAdWithErrorCallback, RewardBasedVideoAdDidOpenCallback, RewardBasedVideoAdDidStartCallback, RewardBasedVideoAdDidCloseCallback, RewardBasedVideoAdDidRewardUserCallback, RewardBasedVideoAdWillLeaveApplicationCallback, RewardBasedVideoAdDidCompleteCallback); } // Load an ad. public void LoadAd(AdRequest request, string adUnitId) { IntPtr requestPtr = Utils.BuildAdRequest(request); Externs.GADURequestRewardBasedVideoAd( this.RewardBasedVideoAdPtr, requestPtr, adUnitId); Externs.GADURelease(requestPtr); } // Show the reward based video on the screen. public void ShowRewardBasedVideoAd() { Externs.GADUShowRewardBasedVideoAd(this.RewardBasedVideoAdPtr); } // Sets the user ID to be used in server-to-server reward callbacks. public void SetUserId(string userId) { Externs.GADUSetRewardBasedVideoAdUserId(this.RewardBasedVideoAdPtr, userId); } public bool IsLoaded() { return Externs.GADURewardBasedVideoAdReady(this.RewardBasedVideoAdPtr); } // Returns the mediation adapter class name. public string MediationAdapterClassName() { return Externs.GADUMediationAdapterClassNameForRewardedVideo(this.RewardBasedVideoAdPtr); } // Destroys the rewarded video ad. public void DestroyRewardedVideoAd() { this.RewardBasedVideoAdPtr = IntPtr.Zero; } public void Dispose() { this.DestroyRewardedVideoAd(); ((GCHandle)this.rewardBasedVideoAdClientPtr).Free(); } ~RewardBasedVideoAdClient() { this.Dispose(); } #endregion #region Reward based video ad callback methods [MonoPInvokeCallback(typeof(GADURewardBasedVideoAdDidReceiveAdCallback))] private static void RewardBasedVideoAdDidReceiveAdCallback(IntPtr rewardBasedVideoAdClient) { RewardBasedVideoAdClient client = IntPtrToRewardBasedVideoClient( rewardBasedVideoAdClient); if (client.OnAdLoaded != null) { client.OnAdLoaded(client, EventArgs.Empty); } } [MonoPInvokeCallback(typeof(GADURewardBasedVideoAdDidFailToReceiveAdWithErrorCallback))] private static void RewardBasedVideoAdDidFailToReceiveAdWithErrorCallback( IntPtr rewardBasedVideoAdClient, string error) { RewardBasedVideoAdClient client = IntPtrToRewardBasedVideoClient( rewardBasedVideoAdClient); if (client.OnAdFailedToLoad != null) { AdFailedToLoadEventArgs args = new AdFailedToLoadEventArgs() { Message = error }; client.OnAdFailedToLoad(client, args); } } [MonoPInvokeCallback(typeof(GADURewardBasedVideoAdDidOpenCallback))] private static void RewardBasedVideoAdDidOpenCallback(IntPtr rewardBasedVideoAdClient) { RewardBasedVideoAdClient client = IntPtrToRewardBasedVideoClient( rewardBasedVideoAdClient); if (client.OnAdOpening != null) { client.OnAdOpening(client, EventArgs.Empty); } } [MonoPInvokeCallback(typeof(GADURewardBasedVideoAdDidStartCallback))] private static void RewardBasedVideoAdDidStartCallback(IntPtr rewardBasedVideoAdClient) { RewardBasedVideoAdClient client = IntPtrToRewardBasedVideoClient( rewardBasedVideoAdClient); if (client.OnAdStarted != null) { client.OnAdStarted(client, EventArgs.Empty); } } [MonoPInvokeCallback(typeof(GADURewardBasedVideoAdDidCloseCallback))] private static void RewardBasedVideoAdDidCloseCallback(IntPtr rewardBasedVideoAdClient) { RewardBasedVideoAdClient client = IntPtrToRewardBasedVideoClient( rewardBasedVideoAdClient); if (client.OnAdClosed != null) { client.OnAdClosed(client, EventArgs.Empty); } } [MonoPInvokeCallback(typeof(GADURewardBasedVideoAdDidRewardCallback))] private static void RewardBasedVideoAdDidRewardUserCallback( IntPtr rewardBasedVideoAdClient, string rewardType, double rewardAmount) { RewardBasedVideoAdClient client = IntPtrToRewardBasedVideoClient( rewardBasedVideoAdClient); if (client.OnAdRewarded != null) { Reward args = new Reward() { Type = rewardType, Amount = rewardAmount }; client.OnAdRewarded(client, args); } } [MonoPInvokeCallback(typeof(GADURewardBasedVideoAdWillLeaveApplicationCallback))] private static void RewardBasedVideoAdWillLeaveApplicationCallback( IntPtr rewardBasedVideoAdClient) { RewardBasedVideoAdClient client = IntPtrToRewardBasedVideoClient( rewardBasedVideoAdClient); if (client.OnAdLeavingApplication != null) { client.OnAdLeavingApplication(client, EventArgs.Empty); } } [MonoPInvokeCallback(typeof(GADURewardBasedVideoAdDidCompleteCallback))] private static void RewardBasedVideoAdDidCompleteCallback( IntPtr rewardBasedVideoAdClient) { RewardBasedVideoAdClient client = IntPtrToRewardBasedVideoClient( rewardBasedVideoAdClient); if (client.OnAdCompleted != null) { client.OnAdCompleted(client, EventArgs.Empty); } } private static RewardBasedVideoAdClient IntPtrToRewardBasedVideoClient( IntPtr rewardBasedVideoAdClient) { GCHandle handle = (GCHandle)rewardBasedVideoAdClient; return handle.Target as RewardBasedVideoAdClient; } #endregion } } #endif