| 
									
										
										
										
											2025-08-30 13:48:51 +00:00
										 |  |  | using System.Collections.Generic; | 
					
						
							|  |  |  | using GoogleMobileAds.Api; | 
					
						
							|  |  |  | using System; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-09-01 10:32:50 +00:00
										 |  |  | namespace WZ | 
					
						
							| 
									
										
										
										
											2025-08-30 13:48:51 +00:00
										 |  |  | { | 
					
						
							|  |  |  |     public class AdmobBannerAdManager | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         private Dictionary<string, BannerView> _bannerAds = new Dictionary<string, BannerView>(); | 
					
						
							|  |  |  |         private Dictionary<string, int> _retryCounters = new Dictionary<string, int>(); | 
					
						
							|  |  |  |         private Dictionary<string, Action> _loadCallbacks = new Dictionary<string, Action>(); | 
					
						
							|  |  |  |         private Dictionary<string, double> _adRevenueCache = new Dictionary<string, double>(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         public void InitializeAdUnits(BannerAliignType type, List<string> adUnitIds, | 
					
						
							| 
									
										
										
										
											2025-09-01 08:57:50 +00:00
										 |  |  |             Action<string,string> onAdLoaded = null, | 
					
						
							| 
									
										
										
										
											2025-08-30 13:48:51 +00:00
										 |  |  |             Action<string,int, string> onAdLoadFailed = null, | 
					
						
							|  |  |  |             Action<AdValue> OnAdPaid = null, | 
					
						
							| 
									
										
										
										
											2025-09-01 08:57:50 +00:00
										 |  |  |             Action<string,string,double> onAdClicked = null) | 
					
						
							| 
									
										
										
										
											2025-08-30 13:48:51 +00:00
										 |  |  |         { | 
					
						
							|  |  |  |             foreach (var adUnitId in adUnitIds) | 
					
						
							|  |  |  |             { | 
					
						
							|  |  |  |                 CreateRewardedAd(type, adUnitId, onAdLoaded, onAdLoadFailed,OnAdPaid, onAdClicked); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |          | 
					
						
							| 
									
										
										
										
											2025-09-01 08:57:50 +00:00
										 |  |  |         private void CreateRewardedAd(BannerAliignType type,string adUnitId, | 
					
						
							|  |  |  |             Action<string,string> onAdLoaded,  | 
					
						
							| 
									
										
										
										
											2025-08-30 13:48:51 +00:00
										 |  |  |             Action<string,int, string> onAdLoadFailed, | 
					
						
							|  |  |  |             Action<AdValue> OnAdPaid, | 
					
						
							| 
									
										
										
										
											2025-09-01 08:57:50 +00:00
										 |  |  |             Action<string,string,double> onAdClicked) | 
					
						
							| 
									
										
										
										
											2025-08-30 13:48:51 +00:00
										 |  |  |         { | 
					
						
							|  |  |  |             if (_bannerAds.ContainsKey(adUnitId)) | 
					
						
							|  |  |  |             { | 
					
						
							|  |  |  |                 LoggerUtils.Debug($"Bigo banner Ad unit {adUnitId} already exists"); | 
					
						
							|  |  |  |                 return; | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |              | 
					
						
							|  |  |  |             var bannerAds = new BannerView(adUnitId, AdSize.Banner, type == BannerAliignType.BannerCenterBottomAlign ? AdPosition.Bottom : AdPosition.Top); | 
					
						
							| 
									
										
										
										
											2025-09-03 06:56:58 +00:00
										 |  |  |              | 
					
						
							|  |  |  |             bannerAds.Hide(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-08-30 13:48:51 +00:00
										 |  |  |             _bannerAds[adUnitId] = bannerAds; | 
					
						
							|  |  |  |             _retryCounters[adUnitId] = 0; | 
					
						
							|  |  |  |             _adRevenueCache[adUnitId] = 0; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             bannerAds.OnBannerAdLoaded += () => | 
					
						
							|  |  |  |             { | 
					
						
							|  |  |  |                 _retryCounters[adUnitId] = 0; | 
					
						
							|  |  |  |                 _adRevenueCache[adUnitId] = AdmobUtils.GetBannerEcpm(bannerAds); | 
					
						
							|  |  |  |                 LoggerUtils.Debug($"[Admob] banner -[Load]: {adUnitId} successfully"); | 
					
						
							| 
									
										
										
										
											2025-09-01 08:57:50 +00:00
										 |  |  |                 onAdLoaded?.Invoke(bannerAds.GetResponseInfo().GetLoadedAdapterResponseInfo().AdSourceName, | 
					
						
							| 
									
										
										
										
											2025-09-02 13:42:07 +00:00
										 |  |  |                 adUnitId); | 
					
						
							| 
									
										
										
										
											2025-08-31 14:18:31 +00:00
										 |  |  |                 AdsKeyEvents.Instance.LogAdFPUEvents(AdsType.Banner); | 
					
						
							| 
									
										
										
										
											2025-08-30 13:48:51 +00:00
										 |  |  |             }; | 
					
						
							|  |  |  |              | 
					
						
							|  |  |  |             bannerAds.OnBannerAdLoadFailed += ((msg) => | 
					
						
							|  |  |  |             { | 
					
						
							| 
									
										
										
										
											2025-09-03 08:56:30 +00:00
										 |  |  |                 if (!_retryCounters.TryAdd(adUnitId, 0)) | 
					
						
							|  |  |  |                 { | 
					
						
							|  |  |  |                     _retryCounters[adUnitId]++; | 
					
						
							|  |  |  |                 } | 
					
						
							| 
									
										
										
										
											2025-08-30 13:48:51 +00:00
										 |  |  |                 double retryDelay = Math.Pow(2, Math.Min(6, _retryCounters[adUnitId])); | 
					
						
							|  |  |  |                 LoggerUtils.Debug($"[Admob] banner -[Load]: {adUnitId} failed, error message = {msg}"); | 
					
						
							|  |  |  |                  | 
					
						
							|  |  |  |                 // 延迟重试加载 | 
					
						
							|  |  |  |                 _loadCallbacks[adUnitId] = () => LoadAd(adUnitId); | 
					
						
							| 
									
										
										
										
											2025-09-01 13:28:17 +00:00
										 |  |  |                 TimerUtils.Instance.DelayExecute((float)retryDelay, () => _loadCallbacks[adUnitId]?.Invoke()); | 
					
						
							| 
									
										
										
										
											2025-08-30 13:48:51 +00:00
										 |  |  |                 onAdLoadFailed?.Invoke(adUnitId, msg.GetCode(), msg.GetMessage()); | 
					
						
							|  |  |  |             }); | 
					
						
							|  |  |  |              | 
					
						
							|  |  |  |             bannerAds.OnAdPaid += ((adValue) => | 
					
						
							|  |  |  |             { | 
					
						
							|  |  |  |                 LoggerUtils.Debug($"[Admob] banner -[interaction]: {adUnitId} show"); | 
					
						
							| 
									
										
										
										
											2025-08-31 12:29:24 +00:00
										 |  |  |                 AdmobAdsManager.Instance.TrackAdImpression(bannerAds.GetResponseInfo().GetLoadedAdapterResponseInfo(), | 
					
						
							| 
									
										
										
										
											2025-08-31 08:26:53 +00:00
										 |  |  |                         adValue, | 
					
						
							|  |  |  |                         AdsType.Banner, | 
					
						
							| 
									
										
										
										
											2025-09-02 13:42:07 +00:00
										 |  |  |                         adUnitId); | 
					
						
							| 
									
										
										
										
											2025-08-31 12:29:24 +00:00
										 |  |  |                  | 
					
						
							| 
									
										
										
										
											2025-08-30 13:48:51 +00:00
										 |  |  |                 OnAdPaid?.Invoke(adValue); | 
					
						
							|  |  |  |             }); | 
					
						
							|  |  |  |                      | 
					
						
							|  |  |  |             bannerAds.OnAdClicked += () => | 
					
						
							|  |  |  |             { | 
					
						
							| 
									
										
										
										
											2025-09-01 08:57:50 +00:00
										 |  |  |                 onAdClicked?.Invoke(bannerAds.GetResponseInfo().GetLoadedAdapterResponseInfo().AdSourceName, | 
					
						
							| 
									
										
										
										
											2025-09-02 13:42:07 +00:00
										 |  |  |                     adUnitId, | 
					
						
							| 
									
										
										
										
											2025-09-01 08:57:50 +00:00
										 |  |  |                     AdmobUtils.GetBannerEcpm(bannerAds)); | 
					
						
							| 
									
										
										
										
											2025-08-30 13:48:51 +00:00
										 |  |  |             }; | 
					
						
							|  |  |  |             LoadAd(adUnitId); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         public void LoadAd(string adUnitId) | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             if (_bannerAds.TryGetValue(adUnitId, out var ad)) | 
					
						
							|  |  |  |             { | 
					
						
							|  |  |  |                 ad.LoadAd(new AdRequest()); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |          | 
					
						
							|  |  |  |         // 显示价格最高的广告 | 
					
						
							|  |  |  |         public void ShowHighestPayingAd() | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             var highestPayingAdUnit = GetHighestPayingAdUnit(); | 
					
						
							|  |  |  |             if (!string.IsNullOrEmpty(highestPayingAdUnit)) | 
					
						
							|  |  |  |             { | 
					
						
							|  |  |  |                 ShowAd(highestPayingAdUnit); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         public void HideBanner() | 
					
						
							|  |  |  |         {    | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             var highestPayingAdUnit = GetHighestPayingAdUnit(); | 
					
						
							|  |  |  |             if (!string.IsNullOrEmpty(highestPayingAdUnit)) | 
					
						
							|  |  |  |             { | 
					
						
							|  |  |  |                 if (_bannerAds.TryGetValue(highestPayingAdUnit, out var ad)) | 
					
						
							|  |  |  |                 { | 
					
						
							|  |  |  |                     ad.Hide(); | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         // 显示特定广告位的广告 | 
					
						
							|  |  |  |         private void ShowAd(string adUnitId) | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             if (_bannerAds.TryGetValue(adUnitId, out var ad)) | 
					
						
							|  |  |  |             { | 
					
						
							|  |  |  |                 ad.Show(); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |          | 
					
						
							|  |  |  |         // 获取所有可用的广告位 | 
					
						
							|  |  |  |         public List<string> GetAvailableAdUnits() | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             var available = new List<string>(); | 
					
						
							|  |  |  |             foreach (var kvp in _bannerAds) | 
					
						
							|  |  |  |             { | 
					
						
							|  |  |  |                 available.Add(kvp.Key); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |             return available; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |                  | 
					
						
							|  |  |  |         // 获取特定广告位的收益信息 | 
					
						
							|  |  |  |         public double GetAdRevenue(string adUnitId) | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             if (_adRevenueCache.TryGetValue(adUnitId, out var revenue)) | 
					
						
							|  |  |  |             { | 
					
						
							|  |  |  |                 return revenue; | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |             return 0; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         // 获取价格最高的广告位ID | 
					
						
							|  |  |  |         public string GetHighestPayingAdUnit() | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             string highestPayingAdUnit = null; | 
					
						
							|  |  |  |             double highestRevenue = 0; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             foreach (var kvp in _adRevenueCache) | 
					
						
							|  |  |  |             { | 
					
						
							|  |  |  |                 var adUnitId = kvp.Key; | 
					
						
							|  |  |  |                 var revenue = kvp.Value; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                 // 确保广告确实已加载并且价格更高 | 
					
						
							|  |  |  |                 if (revenue > highestRevenue) | 
					
						
							|  |  |  |                 { | 
					
						
							|  |  |  |                     highestRevenue = revenue; | 
					
						
							|  |  |  |                     highestPayingAdUnit = adUnitId; | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             return highestPayingAdUnit; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |          | 
					
						
							|  |  |  |         // 获取价格最高的广告收益信息 | 
					
						
							|  |  |  |         public double GetHighestPayingAdRevenue() | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             var highestPayingAdUnit = GetHighestPayingAdUnit(); | 
					
						
							|  |  |  |             if (!string.IsNullOrEmpty(highestPayingAdUnit) &&  | 
					
						
							|  |  |  |                 _adRevenueCache.TryGetValue(highestPayingAdUnit, out var revenue)) | 
					
						
							|  |  |  |             { | 
					
						
							|  |  |  |                 return revenue; | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |             return 0; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         // 清理资源 | 
					
						
							|  |  |  |         public void Destroy() | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             foreach (var ad in _bannerAds.Values) | 
					
						
							|  |  |  |             { | 
					
						
							|  |  |  |                 ad.Destroy(); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |             _bannerAds.Clear(); | 
					
						
							|  |  |  |             _retryCounters.Clear(); | 
					
						
							|  |  |  |             _loadCallbacks.Clear(); | 
					
						
							|  |  |  |             _adRevenueCache.Clear(); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 |