You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

275 lines
9.7 KiB

  1. // Copyright (C) 2015 Google, Inc.
  2. //
  3. // Licensed under the Apache License, Version 2.0 (the "License");
  4. // you may not use this file except in compliance with the License.
  5. // You may obtain a copy of the License at
  6. //
  7. // http://www.apache.org/licenses/LICENSE-2.0
  8. //
  9. // Unless required by applicable law or agreed to in writing, software
  10. // distributed under the License is distributed on an "AS IS" BASIS,
  11. // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  12. // See the License for the specific language governing permissions and
  13. // limitations under the License.
  14. #if UNITY_IOS
  15. using System;
  16. using System.Collections.Generic;
  17. using System.Runtime.InteropServices;
  18. using UnityEngine;
  19. using GoogleMobileAds.Api;
  20. using GoogleMobileAds.Common;
  21. namespace GoogleMobileAds.iOS
  22. {
  23. public class RewardBasedVideoAdClient : IRewardBasedVideoAdClient, IDisposable
  24. {
  25. private IntPtr rewardBasedVideoAdPtr;
  26. private IntPtr rewardBasedVideoAdClientPtr;
  27. #region reward based video callback types
  28. internal delegate void GADURewardBasedVideoAdDidReceiveAdCallback(
  29. IntPtr rewardBasedVideoAdClient);
  30. internal delegate void GADURewardBasedVideoAdDidFailToReceiveAdWithErrorCallback(
  31. IntPtr rewardBasedVideoClient, string error);
  32. internal delegate void GADURewardBasedVideoAdDidOpenCallback(
  33. IntPtr rewardBasedVideoAdClient);
  34. internal delegate void GADURewardBasedVideoAdDidStartCallback(
  35. IntPtr rewardBasedVideoAdClient);
  36. internal delegate void GADURewardBasedVideoAdDidCloseCallback(
  37. IntPtr rewardBasedVideoAdClient);
  38. internal delegate void GADURewardBasedVideoAdDidRewardCallback(
  39. IntPtr rewardBasedVideoAdClient, string rewardType, double rewardAmount);
  40. internal delegate void GADURewardBasedVideoAdWillLeaveApplicationCallback(
  41. IntPtr rewardBasedVideoAdClient);
  42. internal delegate void GADURewardBasedVideoAdDidCompleteCallback(
  43. IntPtr rewardBasedVideoAdClient);
  44. #endregion
  45. public event EventHandler<EventArgs> OnAdLoaded;
  46. public event EventHandler<AdFailedToLoadEventArgs> OnAdFailedToLoad;
  47. public event EventHandler<EventArgs> OnAdOpening;
  48. public event EventHandler<EventArgs> OnAdStarted;
  49. public event EventHandler<EventArgs> OnAdClosed;
  50. public event EventHandler<Reward> OnAdRewarded;
  51. public event EventHandler<EventArgs> OnAdLeavingApplication;
  52. public event EventHandler<EventArgs> OnAdCompleted;
  53. // This property should be used when setting the rewardBasedVideoPtr.
  54. private IntPtr RewardBasedVideoAdPtr
  55. {
  56. get { return this.rewardBasedVideoAdPtr; }
  57. set
  58. {
  59. Externs.GADURelease(this.rewardBasedVideoAdPtr);
  60. this.rewardBasedVideoAdPtr = value;
  61. }
  62. }
  63. #region IGoogleMobileAdsRewardBasedVideoClient implementation
  64. // Creates a reward based video.
  65. public void CreateRewardBasedVideoAd()
  66. {
  67. this.rewardBasedVideoAdClientPtr = (IntPtr)GCHandle.Alloc(this);
  68. this.RewardBasedVideoAdPtr = Externs.GADUCreateRewardBasedVideoAd(
  69. this.rewardBasedVideoAdClientPtr);
  70. Externs.GADUSetRewardBasedVideoAdCallbacks(
  71. this.RewardBasedVideoAdPtr,
  72. RewardBasedVideoAdDidReceiveAdCallback,
  73. RewardBasedVideoAdDidFailToReceiveAdWithErrorCallback,
  74. RewardBasedVideoAdDidOpenCallback,
  75. RewardBasedVideoAdDidStartCallback,
  76. RewardBasedVideoAdDidCloseCallback,
  77. RewardBasedVideoAdDidRewardUserCallback,
  78. RewardBasedVideoAdWillLeaveApplicationCallback,
  79. RewardBasedVideoAdDidCompleteCallback);
  80. }
  81. // Load an ad.
  82. public void LoadAd(AdRequest request, string adUnitId)
  83. {
  84. IntPtr requestPtr = Utils.BuildAdRequest(request);
  85. Externs.GADURequestRewardBasedVideoAd(
  86. this.RewardBasedVideoAdPtr, requestPtr, adUnitId);
  87. Externs.GADURelease(requestPtr);
  88. }
  89. // Show the reward based video on the screen.
  90. public void ShowRewardBasedVideoAd()
  91. {
  92. Externs.GADUShowRewardBasedVideoAd(this.RewardBasedVideoAdPtr);
  93. }
  94. // Sets the user ID to be used in server-to-server reward callbacks.
  95. public void SetUserId(string userId)
  96. {
  97. Externs.GADUSetRewardBasedVideoAdUserId(this.RewardBasedVideoAdPtr, userId);
  98. }
  99. public bool IsLoaded()
  100. {
  101. return Externs.GADURewardBasedVideoAdReady(this.RewardBasedVideoAdPtr);
  102. }
  103. // Returns the mediation adapter class name.
  104. public string MediationAdapterClassName()
  105. {
  106. return Externs.GADUMediationAdapterClassNameForRewardedVideo(this.RewardBasedVideoAdPtr);
  107. }
  108. // Destroys the rewarded video ad.
  109. public void DestroyRewardedVideoAd()
  110. {
  111. this.RewardBasedVideoAdPtr = IntPtr.Zero;
  112. }
  113. public void Dispose()
  114. {
  115. this.DestroyRewardedVideoAd();
  116. ((GCHandle)this.rewardBasedVideoAdClientPtr).Free();
  117. }
  118. ~RewardBasedVideoAdClient()
  119. {
  120. this.Dispose();
  121. }
  122. #endregion
  123. #region Reward based video ad callback methods
  124. [MonoPInvokeCallback(typeof(GADURewardBasedVideoAdDidReceiveAdCallback))]
  125. private static void RewardBasedVideoAdDidReceiveAdCallback(IntPtr rewardBasedVideoAdClient)
  126. {
  127. RewardBasedVideoAdClient client = IntPtrToRewardBasedVideoClient(
  128. rewardBasedVideoAdClient);
  129. if (client.OnAdLoaded != null)
  130. {
  131. client.OnAdLoaded(client, EventArgs.Empty);
  132. }
  133. }
  134. [MonoPInvokeCallback(typeof(GADURewardBasedVideoAdDidFailToReceiveAdWithErrorCallback))]
  135. private static void RewardBasedVideoAdDidFailToReceiveAdWithErrorCallback(
  136. IntPtr rewardBasedVideoAdClient, string error)
  137. {
  138. RewardBasedVideoAdClient client = IntPtrToRewardBasedVideoClient(
  139. rewardBasedVideoAdClient);
  140. if (client.OnAdFailedToLoad != null)
  141. {
  142. AdFailedToLoadEventArgs args = new AdFailedToLoadEventArgs()
  143. {
  144. Message = error
  145. };
  146. client.OnAdFailedToLoad(client, args);
  147. }
  148. }
  149. [MonoPInvokeCallback(typeof(GADURewardBasedVideoAdDidOpenCallback))]
  150. private static void RewardBasedVideoAdDidOpenCallback(IntPtr rewardBasedVideoAdClient)
  151. {
  152. RewardBasedVideoAdClient client = IntPtrToRewardBasedVideoClient(
  153. rewardBasedVideoAdClient);
  154. if (client.OnAdOpening != null)
  155. {
  156. client.OnAdOpening(client, EventArgs.Empty);
  157. }
  158. }
  159. [MonoPInvokeCallback(typeof(GADURewardBasedVideoAdDidStartCallback))]
  160. private static void RewardBasedVideoAdDidStartCallback(IntPtr rewardBasedVideoAdClient)
  161. {
  162. RewardBasedVideoAdClient client = IntPtrToRewardBasedVideoClient(
  163. rewardBasedVideoAdClient);
  164. if (client.OnAdStarted != null)
  165. {
  166. client.OnAdStarted(client, EventArgs.Empty);
  167. }
  168. }
  169. [MonoPInvokeCallback(typeof(GADURewardBasedVideoAdDidCloseCallback))]
  170. private static void RewardBasedVideoAdDidCloseCallback(IntPtr rewardBasedVideoAdClient)
  171. {
  172. RewardBasedVideoAdClient client = IntPtrToRewardBasedVideoClient(
  173. rewardBasedVideoAdClient);
  174. if (client.OnAdClosed != null)
  175. {
  176. client.OnAdClosed(client, EventArgs.Empty);
  177. }
  178. }
  179. [MonoPInvokeCallback(typeof(GADURewardBasedVideoAdDidRewardCallback))]
  180. private static void RewardBasedVideoAdDidRewardUserCallback(
  181. IntPtr rewardBasedVideoAdClient, string rewardType, double rewardAmount)
  182. {
  183. RewardBasedVideoAdClient client = IntPtrToRewardBasedVideoClient(
  184. rewardBasedVideoAdClient);
  185. if (client.OnAdRewarded != null)
  186. {
  187. Reward args = new Reward()
  188. {
  189. Type = rewardType,
  190. Amount = rewardAmount
  191. };
  192. client.OnAdRewarded(client, args);
  193. }
  194. }
  195. [MonoPInvokeCallback(typeof(GADURewardBasedVideoAdWillLeaveApplicationCallback))]
  196. private static void RewardBasedVideoAdWillLeaveApplicationCallback(
  197. IntPtr rewardBasedVideoAdClient)
  198. {
  199. RewardBasedVideoAdClient client = IntPtrToRewardBasedVideoClient(
  200. rewardBasedVideoAdClient);
  201. if (client.OnAdLeavingApplication != null)
  202. {
  203. client.OnAdLeavingApplication(client, EventArgs.Empty);
  204. }
  205. }
  206. [MonoPInvokeCallback(typeof(GADURewardBasedVideoAdDidCompleteCallback))]
  207. private static void RewardBasedVideoAdDidCompleteCallback(
  208. IntPtr rewardBasedVideoAdClient)
  209. {
  210. RewardBasedVideoAdClient client = IntPtrToRewardBasedVideoClient(
  211. rewardBasedVideoAdClient);
  212. if (client.OnAdCompleted != null)
  213. {
  214. client.OnAdCompleted(client, EventArgs.Empty);
  215. }
  216. }
  217. private static RewardBasedVideoAdClient IntPtrToRewardBasedVideoClient(
  218. IntPtr rewardBasedVideoAdClient)
  219. {
  220. GCHandle handle = (GCHandle)rewardBasedVideoAdClient;
  221. return handle.Target as RewardBasedVideoAdClient;
  222. }
  223. #endregion
  224. }
  225. }
  226. #endif