using System; using System.Collections.Generic; using System.Diagnostics; using CIG.Extensions; using SUISS.Core; using SUISSEngine; using UnityEngine; namespace CIG { public sealed class AdProviderPool : SingletonMonobehaviour { //[DebuggerBrowsable(DebuggerBrowsableState.Never)] public event AdProviderPool.AdProviderAvailabilityChangedEventHandler AdAvailabilityChangedEvent; private void FireAdAvailabilityChangedEvent(AdProviderType providerType) { if (this.AdAvailabilityChangedEvent != null) { this.AdAvailabilityChangedEvent(providerType); } } protected override void Awake() { base.Awake(); if (this._isValidNewInstance) { this._adProviders[AdProviderType.AdColony] = Singleton.Instance; this._adProviders[AdProviderType.Admob] = Singleton.Instance; this._adProviders[AdProviderType.Chartboost] = Singleton.Instance; foreach (KeyValuePair keyValuePair in this._adProviders) { keyValuePair.Value.AvailabilityChangedEvent += this.OnAvailabilityChanged; } } } private void Start() { if (this._adProviders.Count > 0) { CIGWebService instance = SingletonMonobehaviour.Instance; if (instance.HasPulled) { this.OnWebServicesPullRequestCompleted(); } else { instance.PullRequestCompleted += this.OnWebServicesPullRequestCompleted; } } } protected override void OnDestroy() { if (SingletonMonobehaviour.IsAvailable) { SingletonMonobehaviour.Instance.PullRequestCompleted -= this.OnWebServicesPullRequestCompleted; } foreach (KeyValuePair keyValuePair in this._adProviders) { keyValuePair.Value.AvailabilityChangedEvent -= this.OnAvailabilityChanged; } this.CancelInvoke(new Action(this.StartCaching)); base.OnDestroy(); } public bool AdProviderExists(AdProviderType providerType) { return this._adProviders.ContainsKey(providerType); } public bool IsReady(AdProviderType providerType) { if (this._watchingAd) { return false; } IAdProvider adProvider = this.GetAdProvider(providerType); return adProvider != null && adProvider.IsReady; } public bool ShowAd(AdProviderType providerType, Action callback) { IAdProvider adProvider = this.GetAdProvider(providerType); if (!this._watchingAd && adProvider != null && adProvider.IsReady) { this._watchingAd = true; SingletonMonobehaviour.Instance.RegisterCriticalProcess(this); if (adProvider.ShowAd(delegate(bool success, bool clicked) { this.OnAdWatched(adProvider, success, clicked, callback); })) { return true; } SingletonMonobehaviour.Instance.UnregisterCriticalProcess(this); this._watchingAd = false; UnityEngine.Debug.LogErrorFormat("Failed to ShowAd for '{0}'", new object[] { providerType }); } return false; } private IAdProvider GetAdProvider(AdProviderType providerType) { IAdProvider result; if (this._adProviders.TryGetValue(providerType, out result)) { return result; } UnityEngine.Debug.LogWarningFormat("Missing AdProvider '{0}'", new object[] { providerType }); return null; } private void OnWebServicesPullRequestCompleted() { SingletonMonobehaviour.Instance.PullRequestCompleted -= this.OnWebServicesPullRequestCompleted; foreach (KeyValuePair keyValuePair in this._adProviders) { this._adProvidersRequiringToLoadAnAd.Add(keyValuePair.Value); } this.StartCaching(); } private void StartCaching() { if (this._adProvidersRequiringToLoadAnAd.Count == 0) { return; } IAdProvider adProvider = this._adProvidersRequiringToLoadAnAd[0]; this._adProvidersRequiringToLoadAnAd.RemoveAt(0); adProvider.StartCaching(); if (this._adProvidersRequiringToLoadAnAd.Count > 0) { this.Invoke(new Action(this.StartCaching), 5f, false); } } private void OnAvailabilityChanged(IAdProvider adProvider) { this.FireAdAvailabilityChangedEvent(adProvider.AdProviderType); } private void OnAdWatched(IAdProvider adProvider, bool success, bool clicked, Action callback) { if (success) { CIGGameStats instance = SingletonMonobehaviour.Instance; AdType adType = adProvider.AdType; if (adType != AdType.Video) { if (adType != AdType.Interstitial) { UnityEngine.Debug.LogErrorFormat("Failed to count stats for AdType '{0}'", new object[] { adProvider.AdType }); } else { instance.AddInterstitialWatched(); if (clicked) { instance.AddInterstitialClicked(); } } } else { instance.AddVideoWatched(); if (clicked) { instance.AddVideoClicked(); } } } SingletonMonobehaviour.Instance.AddScreenViewed("none"); this._watchingAd = false; SingletonMonobehaviour.Instance.UnregisterCriticalProcess(this); if (callback != null) { callback(success, clicked); } } public const float TimeBetweenAdLoadAttemptsInSeconds = 5f; private Dictionary _adProviders = new Dictionary(); private List _adProvidersRequiringToLoadAnAd = new List(); private bool _watchingAd; public delegate void AdProviderAvailabilityChangedEventHandler(AdProviderType providerType); } }