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.
 
 
 

270 lines
8.6 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 GoogleMobileAds.Api;
  19. using GoogleMobileAds.Common;
  20. namespace GoogleMobileAds.iOS
  21. {
  22. public class BannerClient : IBannerClient, IDisposable
  23. {
  24. private IntPtr bannerViewPtr;
  25. private IntPtr bannerClientPtr;
  26. #region Banner callback types
  27. internal delegate void GADUAdViewDidReceiveAdCallback(IntPtr bannerClient);
  28. internal delegate void GADUAdViewDidFailToReceiveAdWithErrorCallback(
  29. IntPtr bannerClient, string error);
  30. internal delegate void GADUAdViewWillPresentScreenCallback(IntPtr bannerClient);
  31. internal delegate void GADUAdViewDidDismissScreenCallback(IntPtr bannerClient);
  32. internal delegate void GADUAdViewWillLeaveApplicationCallback(IntPtr bannerClient);
  33. #endregion
  34. public event EventHandler<EventArgs> OnAdLoaded;
  35. public event EventHandler<AdFailedToLoadEventArgs> OnAdFailedToLoad;
  36. public event EventHandler<EventArgs> OnAdOpening;
  37. public event EventHandler<EventArgs> OnAdClosed;
  38. public event EventHandler<EventArgs> OnAdLeavingApplication;
  39. // This property should be used when setting the bannerViewPtr.
  40. private IntPtr BannerViewPtr
  41. {
  42. get
  43. {
  44. return this.bannerViewPtr;
  45. }
  46. set
  47. {
  48. Externs.GADURelease(this.bannerViewPtr);
  49. this.bannerViewPtr = value;
  50. }
  51. }
  52. #region IBannerClient implementation
  53. // Creates a banner view.
  54. public void CreateBannerView(string adUnitId, AdSize adSize, AdPosition position)
  55. {
  56. this.bannerClientPtr = (IntPtr)GCHandle.Alloc(this);
  57. if (adSize.IsSmartBanner)
  58. {
  59. this.BannerViewPtr = Externs.GADUCreateSmartBannerView(
  60. this.bannerClientPtr, adUnitId, (int)position);
  61. }
  62. else
  63. {
  64. this.BannerViewPtr = Externs.GADUCreateBannerView(
  65. this.bannerClientPtr, adUnitId, adSize.Width, adSize.Height, (int)position);
  66. }
  67. Externs.GADUSetBannerCallbacks(
  68. this.BannerViewPtr,
  69. AdViewDidReceiveAdCallback,
  70. AdViewDidFailToReceiveAdWithErrorCallback,
  71. AdViewWillPresentScreenCallback,
  72. AdViewDidDismissScreenCallback,
  73. AdViewWillLeaveApplicationCallback);
  74. }
  75. public void CreateBannerView(string adUnitId, AdSize adSize, int x, int y)
  76. {
  77. this.bannerClientPtr = (IntPtr)GCHandle.Alloc(this);
  78. if (adSize.IsSmartBanner)
  79. {
  80. this.BannerViewPtr = Externs.GADUCreateSmartBannerViewWithCustomPosition(
  81. this.bannerClientPtr,
  82. adUnitId,
  83. x,
  84. y);
  85. }
  86. else
  87. {
  88. this.BannerViewPtr = Externs.GADUCreateBannerViewWithCustomPosition(
  89. this.bannerClientPtr,
  90. adUnitId,
  91. adSize.Width,
  92. adSize.Height,
  93. x,
  94. y);
  95. }
  96. Externs.GADUSetBannerCallbacks(
  97. this.BannerViewPtr,
  98. AdViewDidReceiveAdCallback,
  99. AdViewDidFailToReceiveAdWithErrorCallback,
  100. AdViewWillPresentScreenCallback,
  101. AdViewDidDismissScreenCallback,
  102. AdViewWillLeaveApplicationCallback);
  103. }
  104. // Loads an ad.
  105. public void LoadAd(AdRequest request)
  106. {
  107. IntPtr requestPtr = Utils.BuildAdRequest(request);
  108. Externs.GADURequestBannerAd(this.BannerViewPtr, requestPtr);
  109. Externs.GADURelease(requestPtr);
  110. }
  111. // Displays the banner view on the screen.
  112. public void ShowBannerView()
  113. {
  114. Externs.GADUShowBannerView(this.BannerViewPtr);
  115. }
  116. // Hides the banner view from the screen.
  117. public void HideBannerView()
  118. {
  119. Externs.GADUHideBannerView(this.BannerViewPtr);
  120. }
  121. // Destroys the banner view.
  122. public void DestroyBannerView()
  123. {
  124. Externs.GADURemoveBannerView(this.BannerViewPtr);
  125. this.BannerViewPtr = IntPtr.Zero;
  126. }
  127. // Returns the height of the BannerView in pixels.
  128. public float GetHeightInPixels()
  129. {
  130. return Externs.GADUGetBannerViewHeightInPixels(this.BannerViewPtr);
  131. }
  132. // Returns the width of the BannerView in pixels.
  133. public float GetWidthInPixels()
  134. {
  135. return Externs.GADUGetBannerViewWidthInPixels(this.BannerViewPtr);
  136. }
  137. // Set the position of the banner view using standard position.
  138. public void SetPosition(AdPosition adPosition)
  139. {
  140. Externs.GADUSetBannerViewAdPosition(this.BannerViewPtr, (int)adPosition);
  141. }
  142. // Set the position of the banner view using custom position.
  143. public void SetPosition(int x, int y)
  144. {
  145. Externs.GADUSetBannerViewCustomPosition(this.BannerViewPtr, x, y);
  146. }
  147. // Returns the mediation adapter class name.
  148. public string MediationAdapterClassName()
  149. {
  150. return Externs.GADUMediationAdapterClassNameForBannerView(this.BannerViewPtr);
  151. }
  152. public void Dispose()
  153. {
  154. this.DestroyBannerView();
  155. ((GCHandle)this.bannerClientPtr).Free();
  156. }
  157. ~BannerClient()
  158. {
  159. this.Dispose();
  160. }
  161. #endregion
  162. #region Banner callback methods
  163. [MonoPInvokeCallback(typeof(GADUAdViewDidReceiveAdCallback))]
  164. private static void AdViewDidReceiveAdCallback(IntPtr bannerClient)
  165. {
  166. BannerClient client = IntPtrToBannerClient(bannerClient);
  167. if (client.OnAdLoaded != null)
  168. {
  169. client.OnAdLoaded(client, EventArgs.Empty);
  170. }
  171. }
  172. [MonoPInvokeCallback(typeof(GADUAdViewDidFailToReceiveAdWithErrorCallback))]
  173. private static void AdViewDidFailToReceiveAdWithErrorCallback(
  174. IntPtr bannerClient, string error)
  175. {
  176. BannerClient client = IntPtrToBannerClient(bannerClient);
  177. if (client.OnAdFailedToLoad != null)
  178. {
  179. AdFailedToLoadEventArgs args = new AdFailedToLoadEventArgs()
  180. {
  181. Message = error
  182. };
  183. client.OnAdFailedToLoad(client, args);
  184. }
  185. }
  186. [MonoPInvokeCallback(typeof(GADUAdViewWillPresentScreenCallback))]
  187. private static void AdViewWillPresentScreenCallback(IntPtr bannerClient)
  188. {
  189. BannerClient client = IntPtrToBannerClient(bannerClient);
  190. if (client.OnAdOpening != null)
  191. {
  192. client.OnAdOpening(client, EventArgs.Empty);
  193. }
  194. }
  195. [MonoPInvokeCallback(typeof(GADUAdViewDidDismissScreenCallback))]
  196. private static void AdViewDidDismissScreenCallback(IntPtr bannerClient)
  197. {
  198. BannerClient client = IntPtrToBannerClient(bannerClient);
  199. if (client.OnAdClosed != null)
  200. {
  201. client.OnAdClosed(client, EventArgs.Empty);
  202. }
  203. }
  204. [MonoPInvokeCallback(typeof(GADUAdViewWillLeaveApplicationCallback))]
  205. private static void AdViewWillLeaveApplicationCallback(IntPtr bannerClient)
  206. {
  207. BannerClient client = IntPtrToBannerClient(bannerClient);
  208. if (client.OnAdLeavingApplication != null)
  209. {
  210. client.OnAdLeavingApplication(client, EventArgs.Empty);
  211. }
  212. }
  213. private static BannerClient IntPtrToBannerClient(IntPtr bannerClient)
  214. {
  215. GCHandle handle = (GCHandle)bannerClient;
  216. return handle.Target as BannerClient;
  217. }
  218. #endregion
  219. }
  220. }
  221. #endif