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.
 
 
 

205 lines
5.8 KiB

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Diagnostics;
  4. using CIG.Extensions;
  5. using SUISS.Core;
  6. using SUISSEngine;
  7. using UnityEngine;
  8. namespace CIG
  9. {
  10. public sealed class AdProviderPool : SingletonMonobehaviour<AdProviderPool>
  11. {
  12. //[DebuggerBrowsable(DebuggerBrowsableState.Never)]
  13. public event AdProviderPool.AdProviderAvailabilityChangedEventHandler AdAvailabilityChangedEvent;
  14. private void FireAdAvailabilityChangedEvent(AdProviderType providerType)
  15. {
  16. if (this.AdAvailabilityChangedEvent != null)
  17. {
  18. this.AdAvailabilityChangedEvent(providerType);
  19. }
  20. }
  21. protected override void Awake()
  22. {
  23. base.Awake();
  24. if (this._isValidNewInstance)
  25. {
  26. this._adProviders[AdProviderType.AdColony] = Singleton<AdColonyVideoAdsProvider>.Instance;
  27. this._adProviders[AdProviderType.Admob] = Singleton<AdMobInterstitialAdsProvider>.Instance;
  28. this._adProviders[AdProviderType.Chartboost] = Singleton<ChartboostVideoAdsProvider>.Instance;
  29. foreach (KeyValuePair<AdProviderType, IAdProvider> keyValuePair in this._adProviders)
  30. {
  31. keyValuePair.Value.AvailabilityChangedEvent += this.OnAvailabilityChanged;
  32. }
  33. }
  34. }
  35. private void Start()
  36. {
  37. if (this._adProviders.Count > 0)
  38. {
  39. CIGWebService instance = SingletonMonobehaviour<CIGWebService>.Instance;
  40. if (instance.HasPulled)
  41. {
  42. this.OnWebServicesPullRequestCompleted();
  43. }
  44. else
  45. {
  46. instance.PullRequestCompleted += this.OnWebServicesPullRequestCompleted;
  47. }
  48. }
  49. }
  50. protected override void OnDestroy()
  51. {
  52. if (SingletonMonobehaviour<CIGWebService>.IsAvailable)
  53. {
  54. SingletonMonobehaviour<CIGWebService>.Instance.PullRequestCompleted -= this.OnWebServicesPullRequestCompleted;
  55. }
  56. foreach (KeyValuePair<AdProviderType, IAdProvider> keyValuePair in this._adProviders)
  57. {
  58. keyValuePair.Value.AvailabilityChangedEvent -= this.OnAvailabilityChanged;
  59. }
  60. this.CancelInvoke(new Action(this.StartCaching));
  61. base.OnDestroy();
  62. }
  63. public bool AdProviderExists(AdProviderType providerType)
  64. {
  65. return this._adProviders.ContainsKey(providerType);
  66. }
  67. public bool IsReady(AdProviderType providerType)
  68. {
  69. if (this._watchingAd)
  70. {
  71. return false;
  72. }
  73. IAdProvider adProvider = this.GetAdProvider(providerType);
  74. return adProvider != null && adProvider.IsReady;
  75. }
  76. public bool ShowAd(AdProviderType providerType, Action<bool, bool> callback)
  77. {
  78. IAdProvider adProvider = this.GetAdProvider(providerType);
  79. if (!this._watchingAd && adProvider != null && adProvider.IsReady)
  80. {
  81. this._watchingAd = true;
  82. SingletonMonobehaviour<CIGSessionRestarter>.Instance.RegisterCriticalProcess(this);
  83. if (adProvider.ShowAd(delegate(bool success, bool clicked)
  84. {
  85. this.OnAdWatched(adProvider, success, clicked, callback);
  86. }))
  87. {
  88. return true;
  89. }
  90. SingletonMonobehaviour<CIGSessionRestarter>.Instance.UnregisterCriticalProcess(this);
  91. this._watchingAd = false;
  92. UnityEngine.Debug.LogErrorFormat("Failed to ShowAd for '{0}'", new object[]
  93. {
  94. providerType
  95. });
  96. }
  97. return false;
  98. }
  99. private IAdProvider GetAdProvider(AdProviderType providerType)
  100. {
  101. IAdProvider result;
  102. if (this._adProviders.TryGetValue(providerType, out result))
  103. {
  104. return result;
  105. }
  106. UnityEngine.Debug.LogWarningFormat("Missing AdProvider '{0}'", new object[]
  107. {
  108. providerType
  109. });
  110. return null;
  111. }
  112. private void OnWebServicesPullRequestCompleted()
  113. {
  114. SingletonMonobehaviour<CIGWebService>.Instance.PullRequestCompleted -= this.OnWebServicesPullRequestCompleted;
  115. foreach (KeyValuePair<AdProviderType, IAdProvider> keyValuePair in this._adProviders)
  116. {
  117. this._adProvidersRequiringToLoadAnAd.Add(keyValuePair.Value);
  118. }
  119. this.StartCaching();
  120. }
  121. private void StartCaching()
  122. {
  123. if (this._adProvidersRequiringToLoadAnAd.Count == 0)
  124. {
  125. return;
  126. }
  127. IAdProvider adProvider = this._adProvidersRequiringToLoadAnAd[0];
  128. this._adProvidersRequiringToLoadAnAd.RemoveAt(0);
  129. adProvider.StartCaching();
  130. if (this._adProvidersRequiringToLoadAnAd.Count > 0)
  131. {
  132. this.Invoke(new Action(this.StartCaching), 5f, false);
  133. }
  134. }
  135. private void OnAvailabilityChanged(IAdProvider adProvider)
  136. {
  137. this.FireAdAvailabilityChangedEvent(adProvider.AdProviderType);
  138. }
  139. private void OnAdWatched(IAdProvider adProvider, bool success, bool clicked, Action<bool, bool> callback)
  140. {
  141. if (success)
  142. {
  143. CIGGameStats instance = SingletonMonobehaviour<CIGGameStats>.Instance;
  144. AdType adType = adProvider.AdType;
  145. if (adType != AdType.Video)
  146. {
  147. if (adType != AdType.Interstitial)
  148. {
  149. UnityEngine.Debug.LogErrorFormat("Failed to count stats for AdType '{0}'", new object[]
  150. {
  151. adProvider.AdType
  152. });
  153. }
  154. else
  155. {
  156. instance.AddInterstitialWatched();
  157. if (clicked)
  158. {
  159. instance.AddInterstitialClicked();
  160. }
  161. }
  162. }
  163. else
  164. {
  165. instance.AddVideoWatched();
  166. if (clicked)
  167. {
  168. instance.AddVideoClicked();
  169. }
  170. }
  171. }
  172. SingletonMonobehaviour<CIGGameStats>.Instance.AddScreenViewed("none");
  173. this._watchingAd = false;
  174. SingletonMonobehaviour<CIGSessionRestarter>.Instance.UnregisterCriticalProcess(this);
  175. if (callback != null)
  176. {
  177. callback(success, clicked);
  178. }
  179. }
  180. public const float TimeBetweenAdLoadAttemptsInSeconds = 5f;
  181. private Dictionary<AdProviderType, IAdProvider> _adProviders = new Dictionary<AdProviderType, IAdProvider>();
  182. private List<IAdProvider> _adProvidersRequiringToLoadAnAd = new List<IAdProvider>();
  183. private bool _watchingAd;
  184. public delegate void AdProviderAvailabilityChangedEventHandler(AdProviderType providerType);
  185. }
  186. }