#if UNITY_ANDROID using System; using BigoAds.Scripts.Api; using BigoAds.Scripts.Api.Constant; using BigoAds.Scripts.Common; using UnityEngine; namespace BigoAds.Scripts.Platforms.Android { class AndroidBannerAd : IBannerAd { private const string BannerAdLoaderClassName = AndroidPlatformTool.ClassPackage + ".api.BannerAdLoader$Builder"; private const string BannerAdRequestClassName = AndroidPlatformTool.ClassPackage + ".api.BannerAdRequest$Builder"; private const string BannerSizeClassName = AndroidPlatformTool.ClassPackage + ".api.AdSize"; private const string BannerBuildMethod = "build"; private const string BannerAdLoaderBuildMethod = "withAdLoadListener"; private const string BannerAdLoaderExtMethod = "withExt"; private AndroidJavaObject BannerAd; public event Action OnLoad; public event Action OnLoadFailed; public event Action OnAdShowed; public event Action OnAdClicked; public event Action OnAdDismissed; public event Action OnAdError; public AndroidBannerAd() { OnAdLoad += ((ad) => { BannerAd = ad; OnLoad?.Invoke(); }); } private event Action OnAdLoad; public void Load(string slotId, BigoBannerRequest request) { if (request == null) { return; } var bannerLoaderBuilder = new AndroidJavaObject(BannerAdLoaderClassName); bannerLoaderBuilder?.Call(BannerAdLoaderExtMethod, request.ExtraInfoJson); bannerLoaderBuilder?.Call(BannerAdLoaderBuildMethod, new AdLoadCallback(OnAdLoad, OnLoadFailed)); var bannerLoader = bannerLoaderBuilder?.Call(BannerBuildMethod); var bannerRequestBuilder = new AndroidJavaObject(BannerAdRequestClassName); bannerRequestBuilder?.Call("withSlotId", slotId); bannerRequestBuilder?.Call("withAge", request.Age); bannerRequestBuilder?.Call("withGender", (int)(request.Gender)); bannerRequestBuilder?.Call("withActivatedTime", request.ActivatedTime); var bannerSize = new AndroidJavaClass(BannerSizeClassName).GetStatic("BANNER"); int width = request.Size.Width; int height = request.Size.Height; if (width == 300 && height == 250) { bannerSize = new AndroidJavaClass(BannerSizeClassName).GetStatic("MEDIUM_RECTANGLE"); } AndroidJavaClass arrayClass = new AndroidJavaClass("java.lang.reflect.Array"); AndroidJavaObject arrayObject = arrayClass.CallStatic("newInstance", new AndroidJavaClass(BannerSizeClassName), 1); arrayClass.CallStatic("set", arrayObject, 0, bannerSize); bannerRequestBuilder?.Call("withAdSizes", arrayObject); var bannerRequest = bannerRequestBuilder?.Call(BannerBuildMethod); bannerLoader?.Call("loadAd", bannerRequest); } public bool IsLoaded() { return BannerAd != null; } public void Show() { BannerAd?.Call("setAdInteractionListener", new AdInteractionCallback(OnAdShowed, OnAdClicked, OnAdDismissed, OnAdError)); AndroidPlatformTool.CallMethodOnMainThread(() => { AdHelper.ShowBannerAd(BannerAd); }); } public void Destroy() { //post to main AdHelper.DestroyAd(BannerAd); } public bool IsExpired() { return BannerAd != null && BannerAd.Call("isExpired"); } public void SetPosition(BigoPosition position) { AndroidPlatformTool.CallMethodOnMainThread(() => { AdHelper.ShowBannerAd(BannerAd, position); }); } public bool IsClientBidding() { if (BannerAd == null) return false; AndroidJavaObject bid = BannerAd.Call("getBid"); return bid != null; } public string GetExtraInfo(string key) { if (BannerAd == null) return ""; return BannerAd.Call("getExtraInfo", key); } /// get price public double getPrice() { if (BannerAd == null) return 0; AndroidJavaObject bid = BannerAd.Call("getBid"); return bid == null ? 0 : bid.Call("getPrice"); } ///notify win public void notifyWin(double secPrice, string secBidder) { if (BannerAd == null) return; var secPriceDouble = new AndroidJavaClass("java.lang.Double").CallStatic ("valueOf", secPrice); BannerAd.Call("getBid")?.Call("notifyWin", secPriceDouble, secBidder); } ///notify loss public void notifyLoss(double firstPrice, string firstBidder, BGAdLossReason lossReason) { if (BannerAd == null) return; var firstPriceDouble = new AndroidJavaClass("java.lang.Double").CallStatic ("valueOf", firstPrice); BannerAd.Call("getBid")?.Call("notifyLoss", firstPriceDouble, firstBidder, (int)lossReason); } } } #endif