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/MaxSdk/Scripts/MaxSdkBase.cs

794 lines
30 KiB
C#

1 month ago
using System;
using System.Collections;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Text;
using AppLovinMax.ThirdParty.MiniJson;
using AppLovinMax.Internal;
using UnityEngine;
#if UNITY_IOS && !UNITY_EDITOR
using System.Runtime.InteropServices;
#endif
public abstract class MaxSdkBase
{
// Shared Properties
protected static readonly MaxUserSegment SharedUserSegment = new MaxUserSegment();
protected static readonly MaxTargetingData SharedTargetingData = new MaxTargetingData();
/// <summary>
/// This enum represents the user's geography used to determine the type of consent flow shown to the user.
/// </summary>
public enum ConsentFlowUserGeography
{
/// <summary>
/// User's geography is unknown.
/// </summary>
Unknown,
/// <summary>
/// The user is in GDPR region.
/// </summary>
Gdpr,
/// <summary>
/// The user is in a non-GDPR region.
/// </summary>
Other
}
#if UNITY_EDITOR || UNITY_IPHONE || UNITY_IOS
/// <summary>
/// App tracking status values. Primarily used in conjunction with iOS14's AppTrackingTransparency.framework.
/// </summary>
public enum AppTrackingStatus
{
/// <summary>
/// Device is on < iOS14, AppTrackingTransparency.framework is not available.
/// </summary>
Unavailable,
/// <summary>
/// The value returned if a user has not yet received an authorization request to authorize access to app-related data that can be used for tracking the user or the device.
/// </summary>
NotDetermined,
/// <summary>
/// The value returned if authorization to access app-related data that can be used for tracking the user or the device is restricted.
/// </summary>
Restricted,
/// <summary>
/// The value returned if the user denies authorization to access app-related data that can be used for tracking the user or the device.
/// </summary>
Denied,
/// <summary>
/// The value returned if the user authorizes access to app-related data that can be used for tracking the user or the device.
/// </summary>
Authorized,
}
#endif
public enum AdViewPosition
{
TopLeft,
TopCenter,
TopRight,
Centered,
CenterLeft,
CenterRight,
BottomLeft,
BottomCenter,
BottomRight
}
public enum BannerPosition
{
TopLeft,
TopCenter,
TopRight,
Centered,
CenterLeft,
CenterRight,
BottomLeft,
BottomCenter,
BottomRight
}
public class SdkConfiguration
{
/// <summary>
/// Whether or not the SDK has been initialized successfully.
/// </summary>
public bool IsSuccessfullyInitialized { get; private set; }
/// <summary>
/// Get the country code for this user.
/// </summary>
public string CountryCode { get; private set; }
#if UNITY_EDITOR || UNITY_IPHONE || UNITY_IOS
/// <summary>
/// App tracking status values. Primarily used in conjunction with iOS14's AppTrackingTransparency.framework.
/// </summary>
public AppTrackingStatus AppTrackingStatus { get; private set; }
#endif
public bool IsTestModeEnabled { get; private set; }
/// <summary>
/// Get the user's geography used to determine the type of consent flow shown to the user.
/// If no such determination could be made, <see cref="MaxSdkBase.ConsentFlowUserGeography.Unknown"/> will be returned.
/// </summary>
public ConsentFlowUserGeography ConsentFlowUserGeography { get; private set; }
[Obsolete("This API has been deprecated and will be removed in a future release.")]
public ConsentDialogState ConsentDialogState { get; private set; }
#if UNITY_EDITOR || !(UNITY_ANDROID || UNITY_IPHONE || UNITY_IOS)
public static SdkConfiguration CreateEmpty()
{
var sdkConfiguration = new SdkConfiguration();
sdkConfiguration.IsSuccessfullyInitialized = true;
#pragma warning disable 0618
sdkConfiguration.ConsentDialogState = ConsentDialogState.Unknown;
#pragma warning restore 0618
#if UNITY_EDITOR
sdkConfiguration.AppTrackingStatus = AppTrackingStatus.Authorized;
#endif
var currentRegion = RegionInfo.CurrentRegion;
sdkConfiguration.CountryCode = currentRegion != null ? currentRegion.TwoLetterISORegionName : "US";
sdkConfiguration.IsTestModeEnabled = false;
return sdkConfiguration;
}
#endif
public static SdkConfiguration Create(IDictionary<string, object> eventProps)
{
var sdkConfiguration = new SdkConfiguration();
sdkConfiguration.IsSuccessfullyInitialized = MaxSdkUtils.GetBoolFromDictionary(eventProps, "isSuccessfullyInitialized");
sdkConfiguration.CountryCode = MaxSdkUtils.GetStringFromDictionary(eventProps, "countryCode", "");
sdkConfiguration.IsTestModeEnabled = MaxSdkUtils.GetBoolFromDictionary(eventProps, "isTestModeEnabled");
var consentFlowUserGeographyStr = MaxSdkUtils.GetStringFromDictionary(eventProps, "consentFlowUserGeography", "");
if ("1".Equals(consentFlowUserGeographyStr))
{
sdkConfiguration.ConsentFlowUserGeography = ConsentFlowUserGeography.Gdpr;
}
else if ("2".Equals(consentFlowUserGeographyStr))
{
sdkConfiguration.ConsentFlowUserGeography = ConsentFlowUserGeography.Other;
}
else
{
sdkConfiguration.ConsentFlowUserGeography = ConsentFlowUserGeography.Unknown;
}
#pragma warning disable 0618
var consentDialogStateStr = MaxSdkUtils.GetStringFromDictionary(eventProps, "consentDialogState", "");
if ("1".Equals(consentDialogStateStr))
{
sdkConfiguration.ConsentDialogState = ConsentDialogState.Applies;
}
else if ("2".Equals(consentDialogStateStr))
{
sdkConfiguration.ConsentDialogState = ConsentDialogState.DoesNotApply;
}
else
{
sdkConfiguration.ConsentDialogState = ConsentDialogState.Unknown;
}
#pragma warning restore 0618
#if UNITY_IPHONE || UNITY_IOS
var appTrackingStatusStr = MaxSdkUtils.GetStringFromDictionary(eventProps, "appTrackingStatus", "-1");
if ("-1".Equals(appTrackingStatusStr))
{
sdkConfiguration.AppTrackingStatus = AppTrackingStatus.Unavailable;
}
else if ("0".Equals(appTrackingStatusStr))
{
sdkConfiguration.AppTrackingStatus = AppTrackingStatus.NotDetermined;
}
else if ("1".Equals(appTrackingStatusStr))
{
sdkConfiguration.AppTrackingStatus = AppTrackingStatus.Restricted;
}
else if ("2".Equals(appTrackingStatusStr))
{
sdkConfiguration.AppTrackingStatus = AppTrackingStatus.Denied;
}
else // "3" is authorized
{
sdkConfiguration.AppTrackingStatus = AppTrackingStatus.Authorized;
}
#endif
return sdkConfiguration;
}
}
public struct Reward
{
public string Label;
public int Amount;
public override string ToString()
{
return "Reward: " + Amount + " " + Label;
}
public bool IsValid()
{
return !string.IsNullOrEmpty(Label) && Amount > 0;
}
}
/**
* This enum contains various error codes that the SDK can return when a MAX ad fails to load or display.
*/
public enum ErrorCode
{
/// <summary>
/// This error code represents an error that could not be categorized into one of the other defined errors. See the message field in the error object for more details.
/// </summary>
Unspecified = -1,
/// <summary>
/// This error code indicates that MAX returned no eligible ads from any mediated networks for this app/device.
/// </summary>
NoFill = 204,
/// <summary>
/// This error code indicates that MAX returned eligible ads from mediated networks, but all ads failed to load. See the adLoadFailureInfo field in the error object for more details.
/// </summary>
AdLoadFailed = -5001,
/// <summary>
/// This error code represents an error that was encountered when showing an ad.
/// </summary>
AdDisplayFailed = -4205,
/// <summary>
/// This error code indicates that the ad request failed due to a generic network error. See the message field in the error object for more details.
/// </summary>
NetworkError = -1000,
/// <summary>
/// This error code indicates that the ad request timed out due to a slow internet connection.
/// </summary>
NetworkTimeout = -1001,
/// <summary>
/// This error code indicates that the ad request failed because the device is not connected to the internet.
/// </summary>
NoNetwork = -1009,
/// <summary>
/// This error code indicates that you attempted to show a fullscreen ad while another fullscreen ad is still showing.
/// </summary>
FullscreenAdAlreadyShowing = -23,
/// <summary>
/// This error code indicates you are attempting to show a fullscreen ad before the one has been loaded.
/// </summary>
FullscreenAdNotReady = -24,
#if UNITY_ANDROID
/// <summary>
/// This error code indicates that the SDK failed to load an ad because it could not find the top Activity.
/// </summary>
NoActivity = -5601,
/// <summary>
/// This error code indicates that the SDK failed to display an ad because the user has the "Don't Keep Activities" developer setting enabled.
/// </summary>
DontKeepActivitiesEnabled = -5602,
#endif
}
/**
* This enum contains possible states of an ad in the waterfall the adapter response info could represent.
*/
public enum MaxAdLoadState
{
/// <summary>
/// The AppLovin Max SDK did not attempt to load an ad from this network in the waterfall because an ad higher
/// in the waterfall loaded successfully.
/// </summary>
AdLoadNotAttempted,
/// <summary>
/// An ad successfully loaded from this network.
/// </summary>
AdLoaded,
/// <summary>
/// An ad failed to load from this network.
/// </summary>
FailedToLoad
}
public class AdInfo
{
public string AdUnitIdentifier { get; private set; }
public string AdFormat { get; private set; }
public string NetworkName { get; private set; }
public string NetworkPlacement { get; private set; }
public string Placement { get; private set; }
public string CreativeIdentifier { get; private set; }
public double Revenue { get; private set; }
public string RevenuePrecision { get; private set; }
public WaterfallInfo WaterfallInfo { get; private set; }
public long LatencyMillis { get; private set; }
public string DspName { get; private set; }
public AdInfo(IDictionary<string, object> adInfoDictionary)
{
AdUnitIdentifier = MaxSdkUtils.GetStringFromDictionary(adInfoDictionary, "adUnitId");
AdFormat = MaxSdkUtils.GetStringFromDictionary(adInfoDictionary, "adFormat");
NetworkName = MaxSdkUtils.GetStringFromDictionary(adInfoDictionary, "networkName");
NetworkPlacement = MaxSdkUtils.GetStringFromDictionary(adInfoDictionary, "networkPlacement");
CreativeIdentifier = MaxSdkUtils.GetStringFromDictionary(adInfoDictionary, "creativeId");
Placement = MaxSdkUtils.GetStringFromDictionary(adInfoDictionary, "placement");
Revenue = MaxSdkUtils.GetDoubleFromDictionary(adInfoDictionary, "revenue", -1);
RevenuePrecision = MaxSdkUtils.GetStringFromDictionary(adInfoDictionary, "revenuePrecision");
WaterfallInfo = new WaterfallInfo(MaxSdkUtils.GetDictionaryFromDictionary(adInfoDictionary, "waterfallInfo", new Dictionary<string, object>()));
LatencyMillis = MaxSdkUtils.GetLongFromDictionary(adInfoDictionary, "latencyMillis");
DspName = MaxSdkUtils.GetStringFromDictionary(adInfoDictionary, "dspName");
}
public override string ToString()
{
return "[AdInfo adUnitIdentifier: " + AdUnitIdentifier +
", adFormat: " + AdFormat +
", networkName: " + NetworkName +
", networkPlacement: " + NetworkPlacement +
", creativeIdentifier: " + CreativeIdentifier +
", placement: " + Placement +
", revenue: " + Revenue +
", revenuePrecision: " + RevenuePrecision +
", latency: " + LatencyMillis +
", dspName: " + DspName + "]";
}
}
/// <summary>
/// Returns information about the ad response in a waterfall.
/// </summary>
public class WaterfallInfo
{
public String Name { get; private set; }
public String TestName { get; private set; }
public List<NetworkResponseInfo> NetworkResponses { get; private set; }
public long LatencyMillis { get; private set; }
public WaterfallInfo(IDictionary<string, object> waterfallInfoDict)
{
Name = MaxSdkUtils.GetStringFromDictionary(waterfallInfoDict, "name");
TestName = MaxSdkUtils.GetStringFromDictionary(waterfallInfoDict, "testName");
var networkResponsesList = MaxSdkUtils.GetListFromDictionary(waterfallInfoDict, "networkResponses", new List<object>());
NetworkResponses = new List<NetworkResponseInfo>();
foreach (var networkResponseObject in networkResponsesList)
{
var networkResponseDict = networkResponseObject as Dictionary<string, object>;
if (networkResponseDict == null) continue;
var networkResponse = new NetworkResponseInfo(networkResponseDict);
NetworkResponses.Add(networkResponse);
}
LatencyMillis = MaxSdkUtils.GetLongFromDictionary(waterfallInfoDict, "latencyMillis");
}
public override string ToString()
{
return "[MediatedNetworkInfo: name = " + Name +
", testName = " + TestName +
", latency = " + LatencyMillis +
", networkResponse = " + string.Join(", ", NetworkResponses.Select(networkResponseInfo => networkResponseInfo.ToString()).ToArray()) + "]";
}
}
public class NetworkResponseInfo
{
public MaxAdLoadState AdLoadState { get; private set; }
public MediatedNetworkInfo MediatedNetwork { get; private set; }
public Dictionary<string, object> Credentials { get; private set; }
public bool IsBidding { get; private set; }
public long LatencyMillis { get; private set; }
public ErrorInfo Error { get; private set; }
public NetworkResponseInfo(IDictionary<string, object> networkResponseInfoDict)
{
var mediatedNetworkInfoDict = MaxSdkUtils.GetDictionaryFromDictionary(networkResponseInfoDict, "mediatedNetwork");
MediatedNetwork = mediatedNetworkInfoDict != null ? new MediatedNetworkInfo(mediatedNetworkInfoDict) : null;
Credentials = MaxSdkUtils.GetDictionaryFromDictionary(networkResponseInfoDict, "credentials", new Dictionary<string, object>());
IsBidding = MaxSdkUtils.GetBoolFromDictionary(networkResponseInfoDict, "isBidding");
LatencyMillis = MaxSdkUtils.GetLongFromDictionary(networkResponseInfoDict, "latencyMillis");
AdLoadState = (MaxAdLoadState) MaxSdkUtils.GetIntFromDictionary(networkResponseInfoDict, "adLoadState");
var errorInfoDict = MaxSdkUtils.GetDictionaryFromDictionary(networkResponseInfoDict, "error");
Error = errorInfoDict != null ? new ErrorInfo(errorInfoDict) : null;
}
public override string ToString()
{
var stringBuilder = new StringBuilder("[NetworkResponseInfo: adLoadState = ").Append(AdLoadState);
stringBuilder.Append(", mediatedNetwork = ").Append(MediatedNetwork);
stringBuilder.Append(", credentials = ").Append(string.Join(", ", Credentials.Select(keyValuePair => keyValuePair.ToString()).ToArray()));
switch (AdLoadState)
{
case MaxAdLoadState.FailedToLoad:
stringBuilder.Append(", error = ").Append(Error);
break;
case MaxAdLoadState.AdLoaded:
stringBuilder.Append(", latency = ").Append(LatencyMillis);
break;
}
return stringBuilder.Append("]").ToString();
}
}
public class MediatedNetworkInfo
{
public string Name { get; private set; }
public string AdapterClassName { get; private set; }
public string AdapterVersion { get; private set; }
public string SdkVersion { get; private set; }
public MediatedNetworkInfo(IDictionary<string, object> mediatedNetworkDictionary)
{
// NOTE: Unity Editor creates empty string
Name = MaxSdkUtils.GetStringFromDictionary(mediatedNetworkDictionary, "name", "");
AdapterClassName = MaxSdkUtils.GetStringFromDictionary(mediatedNetworkDictionary, "adapterClassName", "");
AdapterVersion = MaxSdkUtils.GetStringFromDictionary(mediatedNetworkDictionary, "adapterVersion", "");
SdkVersion = MaxSdkUtils.GetStringFromDictionary(mediatedNetworkDictionary, "sdkVersion", "");
}
public override string ToString()
{
return "[MediatedNetworkInfo name: " + Name +
", adapterClassName: " + AdapterClassName +
", adapterVersion: " + AdapterVersion +
", sdkVersion: " + SdkVersion + "]";
}
}
public class ErrorInfo
{
public ErrorCode Code { get; private set; }
public string Message { get; private set; }
public int MediatedNetworkErrorCode { get; private set; }
public string MediatedNetworkErrorMessage { get; private set; }
public string AdLoadFailureInfo { get; private set; }
public WaterfallInfo WaterfallInfo { get; private set; }
public long LatencyMillis { get; private set; }
public ErrorInfo(IDictionary<string, object> errorInfoDictionary)
{
Code = (ErrorCode) MaxSdkUtils.GetIntFromDictionary(errorInfoDictionary, "errorCode", -1);
Message = MaxSdkUtils.GetStringFromDictionary(errorInfoDictionary, "errorMessage", "");
MediatedNetworkErrorCode = MaxSdkUtils.GetIntFromDictionary(errorInfoDictionary, "mediatedNetworkErrorCode", (int) ErrorCode.Unspecified);
MediatedNetworkErrorMessage = MaxSdkUtils.GetStringFromDictionary(errorInfoDictionary, "mediatedNetworkErrorMessage", "");
AdLoadFailureInfo = MaxSdkUtils.GetStringFromDictionary(errorInfoDictionary, "adLoadFailureInfo", "");
WaterfallInfo = new WaterfallInfo(MaxSdkUtils.GetDictionaryFromDictionary(errorInfoDictionary, "waterfallInfo", new Dictionary<string, object>()));
LatencyMillis = MaxSdkUtils.GetLongFromDictionary(errorInfoDictionary, "latencyMillis");
}
public override string ToString()
{
var stringbuilder = new StringBuilder("[ErrorInfo code: ").Append(Code);
stringbuilder.Append(", message: ").Append(Message);
if (Code == ErrorCode.AdDisplayFailed)
{
stringbuilder.Append(", mediatedNetworkCode: ").Append(MediatedNetworkErrorCode);
stringbuilder.Append(", mediatedNetworkMessage: ").Append(MediatedNetworkErrorMessage);
}
stringbuilder.Append(", latency: ").Append(LatencyMillis);
return stringbuilder.Append(", adLoadFailureInfo: ").Append(AdLoadFailureInfo).Append("]").ToString();
}
}
/// <summary>
/// Inset values for the safe area on the screen used to render banner ads.
/// </summary>
public class SafeAreaInsets
{
public int Left { get; private set; }
public int Top { get; private set; }
public int Right { get; private set; }
public int Bottom { get; private set; }
/// <summary>
/// Creates a new instance of <see cref="SafeAreaInsets"/>.
/// </summary>
/// <param name="insets">An integer array with insets values in the order of left, top, right, and bottom</param>
internal SafeAreaInsets(int[] insets)
{
Left = insets[0];
Top = insets[1];
Right = insets[2];
Bottom = insets[3];
}
public override string ToString()
{
return "[SafeAreaInsets: Left: " + Left +
", Top: " + Top +
", Right: " + Right +
", Bottom: " + Bottom + "]";
}
}
/// <summary>
/// Determines whether ad events raised by the AppLovin's Unity plugin should be invoked on the Unity main thread.
/// </summary>
public static bool? InvokeEventsOnUnityMainThread { get; set; }
/// <summary>
/// The CMP service, which provides direct APIs for interfacing with the Google-certified CMP installed, if any.
/// </summary>
public static MaxCmpService CmpService
{
get { return MaxCmpService.Instance; }
}
protected static void ValidateAdUnitIdentifier(string adUnitIdentifier, string debugPurpose)
{
if (string.IsNullOrEmpty(adUnitIdentifier))
{
MaxSdkLogger.UserError("No MAX Ads Ad Unit ID specified for: " + debugPurpose);
}
}
// Allocate the MaxEventExecutor singleton which handles pushing callbacks from the background to the main thread.
protected static void InitializeEventExecutor()
{
MaxEventExecutor.InitializeIfNeeded();
}
/// <summary>
/// Generates serialized Unity meta data to be passed to the SDK.
/// </summary>
/// <returns>Serialized Unity meta data.</returns>
protected static string GenerateMetaData()
{
var metaData = new Dictionary<string, string>(2);
metaData.Add("UnityVersion", Application.unityVersion);
var graphicsMemorySize = SystemInfo.graphicsMemorySize;
metaData.Add("GraphicsMemorySizeMegabytes", graphicsMemorySize.ToString());
return Json.Serialize(metaData);
}
/// <summary>
/// Parses the prop string provided to a <see cref="Rect"/>.
/// </summary>
/// <param name="rectPropString">A prop string representing a Rect</param>
/// <returns>A <see cref="Rect"/> the prop string represents.</returns>
protected static Rect GetRectFromString(string rectPropString)
{
var rectDict = Json.Deserialize(rectPropString) as Dictionary<string, object>;
var originX = MaxSdkUtils.GetFloatFromDictionary(rectDict, "origin_x", 0);
var originY = MaxSdkUtils.GetFloatFromDictionary(rectDict, "origin_y", 0);
var width = MaxSdkUtils.GetFloatFromDictionary(rectDict, "width", 0);
var height = MaxSdkUtils.GetFloatFromDictionary(rectDict, "height", 0);
return new Rect(originX, originY, width, height);
}
/// <summary>
/// Handles forwarding callbacks from native to C#.
/// </summary>
/// <param name="propsStr">A prop string with the event data</param>
protected static void HandleBackgroundCallback(string propsStr)
{
try
{
MaxSdkCallbacks.ForwardEvent(propsStr);
}
catch (Exception exception)
{
var eventProps = Json.Deserialize(propsStr) as Dictionary<string, object>;
if (eventProps == null) return;
var eventName = MaxSdkUtils.GetStringFromDictionary(eventProps, "name", "");
MaxSdkLogger.UserError("Unable to notify ad delegate due to an error in the publisher callback '" + eventName + "' due to exception: " + exception.Message);
Debug.LogException(exception);
}
}
protected static string SerializeLocalExtraParameterValue(object value)
{
if (!(value.GetType().IsPrimitive || value is string || value is IList || value is IDictionary))
{
MaxSdkLogger.UserError("Local extra parameters must be an IList, IDictionary, string, or a primitive type");
return "";
}
Dictionary<string, object> data = new Dictionary<string, object>
{
{"value", value}
};
return Json.Serialize(data);
}
[Obsolete("This API has been deprecated and will be removed in a future release.")]
public enum ConsentDialogState
{
Unknown,
Applies,
DoesNotApply
}
}
/// <summary>
/// An extension class for <see cref="MaxSdkBase.BannerPosition"/> and <see cref="MaxSdkBase.AdViewPosition"/> enums.
/// </summary>
internal static class AdPositionExtenstion
{
public static string ToSnakeCaseString(this MaxSdkBase.BannerPosition position)
{
if (position == MaxSdkBase.BannerPosition.TopLeft)
{
return "top_left";
}
else if (position == MaxSdkBase.BannerPosition.TopCenter)
{
return "top_center";
}
else if (position == MaxSdkBase.BannerPosition.TopRight)
{
return "top_right";
}
else if (position == MaxSdkBase.BannerPosition.Centered)
{
return "centered";
}
else if (position == MaxSdkBase.BannerPosition.CenterLeft)
{
return "center_left";
}
else if (position == MaxSdkBase.BannerPosition.CenterRight)
{
return "center_right";
}
else if (position == MaxSdkBase.BannerPosition.BottomLeft)
{
return "bottom_left";
}
else if (position == MaxSdkBase.BannerPosition.BottomCenter)
{
return "bottom_center";
}
else // position == MaxSdkBase.BannerPosition.BottomRight
{
return "bottom_right";
}
}
public static string ToSnakeCaseString(this MaxSdkBase.AdViewPosition position)
{
if (position == MaxSdkBase.AdViewPosition.TopLeft)
{
return "top_left";
}
else if (position == MaxSdkBase.AdViewPosition.TopCenter)
{
return "top_center";
}
else if (position == MaxSdkBase.AdViewPosition.TopRight)
{
return "top_right";
}
else if (position == MaxSdkBase.AdViewPosition.Centered)
{
return "centered";
}
else if (position == MaxSdkBase.AdViewPosition.CenterLeft)
{
return "center_left";
}
else if (position == MaxSdkBase.AdViewPosition.CenterRight)
{
return "center_right";
}
else if (position == MaxSdkBase.AdViewPosition.BottomLeft)
{
return "bottom_left";
}
else if (position == MaxSdkBase.AdViewPosition.BottomCenter)
{
return "bottom_center";
}
else // position == MaxSdkBase.AdViewPosition.BottomRight
{
return "bottom_right";
}
}
}
namespace AppLovinMax.Internal.API
{
[Obsolete("This class has been deprecated and will be removed in a future SDK release.")]
public class CFError
{
public int Code { get; private set; }
public string Message { get; private set; }
public static CFError Create(int code = -1, string message = "")
{
return new CFError(code, message);
}
private CFError(int code, string message)
{
Code = code;
Message = message;
}
public override string ToString()
{
return "[CFError Code: " + Code +
", Message: " + Message + "]";
}
}
[Obsolete("This enum has been deprecated. Please use `MaxSdk.GetSdkConfiguration().ConsentFlowUserGeography` instead.")]
public enum CFType
{
Unknown,
Standard,
Detailed
}
public class CFService
{
[Obsolete("This property has been deprecated. Please use `MaxSdk.GetSdkConfiguration().ConsentFlowUserGeography` instead.")]
public static CFType CFType
{
get
{
switch (MaxSdk.GetSdkConfiguration().ConsentFlowUserGeography)
{
case MaxSdkBase.ConsentFlowUserGeography.Unknown:
return CFType.Unknown;
case MaxSdkBase.ConsentFlowUserGeography.Gdpr:
return CFType.Detailed;
case MaxSdkBase.ConsentFlowUserGeography.Other:
return CFType.Standard;
default:
throw new ArgumentOutOfRangeException();
}
}
}
[Obsolete("This method has been deprecated. Please use `MaxSdk.CmpService.ShowCmpForExistingUser` instead.")]
public static void SCF(Action<CFError> onFlowCompletedAction)
{
MaxSdkBase.CmpService.ShowCmpForExistingUser(error =>
{
if (onFlowCompletedAction == null) return;
var cfError = error == null ? null : CFError.Create((int) error.Code, error.Message);
onFlowCompletedAction(cfError);
});
}
}
}