You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
CrowdControl/Assets/GleyPlugins/Ads/Scripts/SupportedAdvertisers/CustomVungle.cs

526 lines
16 KiB
C#

namespace GleyMobileAds
{
using UnityEngine.Events;
using System.Collections.Generic;
using UnityEngine;
#if USE_VUNGLE
using System.Linq;
using System.Collections;
#endif
public class CustomVungle : MonoBehaviour, ICustomAds
{
#if USE_VUNGLE
private UnityAction<bool> OnCompleteMethod;
private UnityAction<bool, string> OnCompleteMethodWithAdvertiser;
private UnityAction OnInterstitialClosed;
private UnityAction<string> OnInterstitialClosedWithAdvertiser;
private UnityAction<bool, BannerPosition, BannerType> DisplayResult;
private UserConsent consent;
private BannerPosition currentPosition;
private BannerType bannerType;
private string appID = "";
private string rewardedPlacementId = "";
private string interstitialPlacementID = "";
private string bannerPlacementID = "";
private bool debug;
private bool initComplete;
private bool bannerUsed;
/// <summary>
/// Initializing Vungle
/// </summary>
/// <param name="consent">user consent -> if true show personalized ads</param>
/// <param name="platformSettings">contains all required settings for this publisher</param>
public void InitializeAds(UserConsent consent, UserConsent ccpaConsent, List<PlatformSettings> platformSettings)
{
this.consent = consent;
debug = Advertisements.Instance.debug;
//get settings
#if UNITY_ANDROID
PlatformSettings settings = platformSettings.First(cond => cond.platform == SupportedPlatforms.Android);
#elif UNITY_IOS
PlatformSettings settings = platformSettings.First(cond => cond.platform == SupportedPlatforms.iOS);
#else
PlatformSettings settings = platformSettings.First(cond => cond.platform == SupportedPlatforms.Windows);
#endif
//apply settings
appID = settings.appId.id;
rewardedPlacementId = settings.idRewarded.id;
interstitialPlacementID = settings.idInterstitial.id;
bannerPlacementID = settings.idBanner.id;
//verify settings
if (debug)
{
Debug.Log(this + " Initialization Started");
ScreenWriter.Write(this + " Initialization Started");
Debug.Log(this + " App ID: " + appID);
ScreenWriter.Write(this + " App ID: " + appID);
Debug.Log(this + " Interstitial Placement ID: " + interstitialPlacementID);
ScreenWriter.Write(this + " Interstitial Placement ID: " + interstitialPlacementID);
Debug.Log(this + " Rewarded Video Placement ID: " + rewardedPlacementId);
ScreenWriter.Write(this + " Rewarded Video Placement ID: " + rewardedPlacementId);
}
//preparing Vungle SDK for initialization
Dictionary<string, bool> placements = new Dictionary<string, bool>
{
{ rewardedPlacementId, false },
{ interstitialPlacementID, false }
};
string[] array = new string[placements.Keys.Count];
placements.Keys.CopyTo(array, 0);
Vungle.onInitializeEvent += InitComplete;
Vungle.onAdStartedEvent += AdStarted;
Vungle.onLogEvent += VungleLog;
Vungle.onAdEndEvent = OnAdEnd;
Vungle.onAdRewardedEvent += OnAdRewarded;
Vungle.onErrorEvent += OnErrorEvent;
Vungle.onPlacementPreparedEvent += OnPlacementPreparedEvent;
Vungle.adPlayableEvent += AdPlayableEvent;
Vungle.init(appID);
}
/// <summary>
/// Updates consent at runtime
/// </summary>
/// <param name="consent">the new consent</param>
public void UpdateConsent(UserConsent consent, UserConsent ccpaConsent)
{
switch (consent)
{
case UserConsent.Unset:
Vungle.updateConsentStatus(Vungle.Consent.Undefined);
break;
case UserConsent.Accept:
Vungle.updateConsentStatus(Vungle.Consent.Accepted);
break;
case UserConsent.Deny:
Vungle.updateConsentStatus(Vungle.Consent.Denied);
break;
}
switch (ccpaConsent)
{
case UserConsent.Unset:
Vungle.updateCCPAStatus(Vungle.Consent.Undefined);
break;
case UserConsent.Accept:
Vungle.updateCCPAStatus(Vungle.Consent.Accepted);
break;
case UserConsent.Deny:
Vungle.updateCCPAStatus(Vungle.Consent.Denied);
break;
}
Debug.Log(this + " Update consent to " + consent);
ScreenWriter.Write(this + " Update consent to " + consent);
}
#region Banner
public void ShowBanner(BannerPosition position, BannerType bannerType, UnityAction<bool, BannerPosition, BannerType> DisplayResult)
{
currentPosition = position;
this.bannerType = bannerType;
this.DisplayResult = DisplayResult;
bannerUsed = true;
if (position == BannerPosition.TOP)
{
Vungle.loadBanner(bannerPlacementID, Vungle.VungleBannerSize.VungleAdSizeBanner, Vungle.VungleBannerPosition.TopCenter);
}
else
{
Vungle.loadBanner(bannerPlacementID, Vungle.VungleBannerSize.VungleAdSizeBanner, Vungle.VungleBannerPosition.BottomCenter);
}
StartCoroutine(WaitForBanner());
}
IEnumerator WaitForBanner()
{
while (Vungle.isAdvertAvailable(bannerPlacementID, Vungle.VungleBannerSize.VungleAdSizeBanner) == false)
{
yield return new WaitForSeconds(0.5f);
}
Vungle.showBanner(bannerPlacementID);
BannerShown();
}
void BannerShown()
{
if (debug)
{
Debug.Log(this + " banner ad shown");
ScreenWriter.Write(this + " banner ad shown");
}
if (DisplayResult != null)
{
DisplayResult(true, currentPosition, bannerType);
DisplayResult = null;
}
}
public void ResetBannerUsage()
{
bannerUsed = false;
}
public bool BannerAlreadyUsed()
{
return bannerUsed;
}
public bool IsBannerAvailable()
{
return true;
}
public void HideBanner()
{
StopAllCoroutines();
Vungle.closeBanner(bannerPlacementID);
}
#endregion
#region Interstitial
/// <summary>
/// Check if Vungle interstitial is available
/// </summary>
/// <returns>true if an interstitial is available</returns>
public bool IsInterstitialAvailable()
{
if (!initComplete)
return false;
return Vungle.isAdvertAvailable(interstitialPlacementID);
}
/// <summary>
/// Show Vungle interstitial
/// </summary>
/// <param name="InterstitialClosed">callback called when user closes interstitial</param>
public void ShowInterstitial(UnityAction InterstitialClosed)
{
if (IsInterstitialAvailable())
{
OnInterstitialClosed = InterstitialClosed;
Vungle.playAd(interstitialPlacementID);
}
}
/// <summary>
/// Show Vungle interstitial
/// </summary>
/// <param name="InterstitialClosed">callback called when user closes interstitial</param>
public void ShowInterstitial(UnityAction<string> InterstitialClosed)
{
if (IsInterstitialAvailable())
{
OnInterstitialClosedWithAdvertiser = InterstitialClosed;
Vungle.playAd(interstitialPlacementID);
}
}
#endregion
#region RewardedVideo
/// <summary>
/// Check if Vungle rewarded video is available
/// </summary>
/// <returns>true if a rewarded video is available</returns>
public bool IsRewardVideoAvailable()
{
if (!initComplete)
return false;
return Vungle.isAdvertAvailable(rewardedPlacementId);
}
/// <summary>
/// Show Vungle rewarded video
/// </summary>
/// <param name="CompleteMethod">callback called when user closes the rewarded video -> if true video was not skipped</param>
public void ShowRewardVideo(UnityAction<bool> CompleteMethod)
{
if (IsRewardVideoAvailable())
{
OnCompleteMethod = CompleteMethod;
Vungle.playAd(rewardedPlacementId);
}
}
/// <summary>
/// Show Vungle rewarded video
/// </summary>
/// <param name="CompleteMethod">callback called when user closes the rewarded video -> if true video was not skipped</param>
public void ShowRewardVideo(UnityAction<bool, string> CompleteMethod)
{
if (IsRewardVideoAvailable())
{
OnCompleteMethodWithAdvertiser = CompleteMethod;
Vungle.playAd(rewardedPlacementId);
}
}
#endregion
#region Events
/// <summary>
/// Vungle specific event triggered after initialization is done
/// </summary>
private void InitComplete()
{
initComplete = true;
Vungle.onInitializeEvent -= InitComplete;
switch (consent)
{
case UserConsent.Unset:
Vungle.updateConsentStatus(Vungle.Consent.Undefined);
break;
case UserConsent.Accept:
Vungle.updateConsentStatus(Vungle.Consent.Accepted);
break;
case UserConsent.Deny:
Vungle.updateConsentStatus(Vungle.Consent.Denied);
break;
}
//load ads
if (!string.IsNullOrEmpty(interstitialPlacementID))
{
Vungle.loadAd(interstitialPlacementID);
}
if (!string.IsNullOrEmpty(rewardedPlacementId))
{
Vungle.loadAd(rewardedPlacementId);
}
if (debug)
{
ScreenWriter.Write(this + " " + "Init Complete");
}
}
private void OnAdRewarded(string placementID)
{
if (debug)
{
ScreenWriter.Write(this + " OnAdRewarded " + placementID);
}
if (placementID == rewardedPlacementId)
{
if (OnCompleteMethod != null)
{
OnCompleteMethod(true);
OnCompleteMethod = null;
}
if (OnCompleteMethodWithAdvertiser != null)
{
OnCompleteMethodWithAdvertiser(true, SupportedAdvertisers.Vungle.ToString());
OnCompleteMethodWithAdvertiser = null;
}
}
}
private void OnAdEnd(string placementID)
{
if (debug)
{
ScreenWriter.Write(this + " OnAdEnd " + placementID);
}
if (placementID == rewardedPlacementId)
{
if (OnCompleteMethod != null)
{
OnCompleteMethod(false);
OnCompleteMethod = null;
}
if (OnCompleteMethodWithAdvertiser != null)
{
OnCompleteMethodWithAdvertiser(false, SupportedAdvertisers.Vungle.ToString());
OnCompleteMethodWithAdvertiser = null;
}
if (debug)
{
ScreenWriter.Write(this + " Load another ad " + placementID);
}
Vungle.loadAd(rewardedPlacementId);
}
if (placementID == interstitialPlacementID)
{
if (OnInterstitialClosed != null)
{
OnInterstitialClosed();
OnInterstitialClosed = null;
}
if (OnInterstitialClosedWithAdvertiser != null)
{
OnInterstitialClosedWithAdvertiser(SupportedAdvertisers.Vungle.ToString());
OnInterstitialClosedWithAdvertiser = null;
}
if (debug)
{
ScreenWriter.Write(this + " Load another ad " + placementID);
}
Vungle.loadAd(interstitialPlacementID);
}
}
private void AdPlayableEvent(string placementID, bool adPlayable)
{
if (debug)
{
ScreenWriter.Write(this + " Ad's playable state has been changed! placementID " + placementID + ". Now: " + adPlayable);
}
}
private void OnPlacementPreparedEvent(string arg1, string arg2)
{
if (debug)
{
ScreenWriter.Write(this + " OnPlacementPreparedEvent " + arg1 + " " + arg2);
}
}
private void OnErrorEvent(string message)
{
if (debug)
{
ScreenWriter.Write(this + " OnErrorEvent -> " + message);
}
if (message.Contains(bannerPlacementID))
{
if (DisplayResult != null)
{
DisplayResult(false, currentPosition, bannerType);
DisplayResult = null;
}
StopAllCoroutines();
}
}
private void AdStarted(string placementID)
{
if (debug)
{
ScreenWriter.Write(this + " AdStarted " + placementID);
}
}
/// <summary>
/// VUngle specific log event
/// </summary>
/// <param name="obj"></param>
private void VungleLog(string obj)
{
if (debug)
{
ScreenWriter.Write(this + " " + obj);
}
}
private void OnApplicationFocus(bool focus)
{
if (focus == true)
{
if(initComplete==false)
{
Vungle.init(appID);
}
}
}
#endregion
#else
//dummy interface implementation, used when Vungle is not enabled
public void HideBanner()
{
}
public void InitializeAds(UserConsent consent, UserConsent ccpaConsent, List<PlatformSettings> platformSettings)
{
}
public void ResetBannerUsage()
{
}
public bool BannerAlreadyUsed()
{
return false;
}
public bool IsBannerAvailable()
{
return false;
}
public bool IsInterstitialAvailable()
{
return false;
}
public bool IsRewardVideoAvailable()
{
return false;
}
public void ShowBanner(BannerPosition position, BannerType type, UnityAction<bool, BannerPosition, BannerType> DisplayResult)
{
}
public void ShowInterstitial(UnityAction InterstitialClosed = null)
{
}
public void ShowInterstitial(UnityAction<string> InterstitialClosed)
{
}
public void ShowRewardVideo(UnityAction<bool> CompleteMethod)
{
}
public void ShowRewardVideo(UnityAction<bool, string> CompleteMethod)
{
}
public void UpdateConsent(UserConsent consent, UserConsent ccpaConsent)
{
}
#endif
}
}