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.
171 lines
4.5 KiB
C#
171 lines
4.5 KiB
C#
//
|
|
// MaxCmpService.cs
|
|
// AppLovin User Engagement Unity Plugin
|
|
//
|
|
// Created by Santosh Bagadi on 10/1/23.
|
|
// Copyright © 2023 AppLovin. All rights reserved.
|
|
//
|
|
|
|
using System;
|
|
using System.Collections.Generic;
|
|
|
|
#if UNITY_EDITOR
|
|
#elif UNITY_ANDROID
|
|
using UnityEngine;
|
|
#elif UNITY_IOS
|
|
using System.Runtime.InteropServices;
|
|
#endif
|
|
|
|
/// <summary>
|
|
/// This class provides direct APIs for interfacing with the Google-certified CMP installed, if any.
|
|
/// </summary>
|
|
public class MaxCmpService
|
|
{
|
|
private static readonly MaxCmpService _instance = new MaxCmpService();
|
|
|
|
private MaxCmpService() { }
|
|
|
|
private static Action<MaxCmpError> OnCompletedAction;
|
|
|
|
#if UNITY_EDITOR
|
|
#elif UNITY_ANDROID
|
|
private static readonly AndroidJavaClass MaxUnityPluginClass = new AndroidJavaClass("com.applovin.mediation.unity.MaxUnityPlugin");
|
|
#elif UNITY_IOS
|
|
[DllImport("__Internal")]
|
|
private static extern void _MaxShowCmpForExistingUser();
|
|
|
|
[DllImport("__Internal")]
|
|
private static extern bool _MaxHasSupportedCmp();
|
|
#endif
|
|
|
|
internal static MaxCmpService Instance
|
|
{
|
|
get { return _instance; }
|
|
}
|
|
|
|
/// <summary>
|
|
/// Shows the CMP flow to an existing user.
|
|
/// Note that the user's current consent will be reset before the CMP alert is shown.
|
|
/// </summary>
|
|
/// <param name="onCompletedAction">Called when the CMP flow finishes showing.</param>
|
|
public void ShowCmpForExistingUser(Action<MaxCmpError> onCompletedAction)
|
|
{
|
|
OnCompletedAction = onCompletedAction;
|
|
|
|
#if UNITY_EDITOR
|
|
var errorProps = new Dictionary<string, object>
|
|
{
|
|
{"code", (int) MaxCmpError.ErrorCode.FormUnavailable},
|
|
{"message", "CMP is not supported in Unity editor"}
|
|
};
|
|
|
|
NotifyCompletedIfNeeded(errorProps);
|
|
#elif UNITY_ANDROID
|
|
MaxUnityPluginClass.CallStatic("showCmpForExistingUser");
|
|
#elif UNITY_IOS
|
|
_MaxShowCmpForExistingUser();
|
|
#endif
|
|
}
|
|
|
|
/// <summary>
|
|
/// Returns <code>true</code> if a supported CMP SDK is detected.
|
|
/// </summary>
|
|
public bool HasSupportedCmp
|
|
{
|
|
get
|
|
{
|
|
#if UNITY_EDITOR
|
|
return false;
|
|
#elif UNITY_ANDROID
|
|
return MaxUnityPluginClass.CallStatic<bool>("hasSupportedCmp");
|
|
#elif UNITY_IOS
|
|
return _MaxHasSupportedCmp();
|
|
#else
|
|
return false;
|
|
#endif
|
|
}
|
|
}
|
|
|
|
internal static void NotifyCompletedIfNeeded(Dictionary<string, object> errorProps)
|
|
{
|
|
if (OnCompletedAction == null) return;
|
|
|
|
var error = (errorProps == null) ? null : MaxCmpError.Create(errorProps);
|
|
OnCompletedAction(error);
|
|
}
|
|
}
|
|
|
|
public class MaxCmpError
|
|
{
|
|
public enum ErrorCode
|
|
{
|
|
/// <summary>
|
|
/// Indicates that an unspecified error has occurred.
|
|
/// </summary>
|
|
Unspecified = -1,
|
|
|
|
/// <summary>
|
|
/// Indicates that the CMP has not been integrated correctly.
|
|
/// </summary>
|
|
IntegrationError = 1,
|
|
|
|
/// <summary>
|
|
/// Indicates that the CMP form is unavailable.
|
|
/// </summary>
|
|
FormUnavailable = 2,
|
|
|
|
/// <summary>
|
|
/// Indicates that the CMP form is not required.
|
|
/// </summary>
|
|
FormNotRequired = 3
|
|
}
|
|
|
|
public static MaxCmpError Create(IDictionary<string, object> error)
|
|
{
|
|
return new MaxCmpError()
|
|
{
|
|
Code = GetCode(MaxSdkUtils.GetIntFromDictionary(error, "code")),
|
|
Message = MaxSdkUtils.GetStringFromDictionary(error, "message"),
|
|
CmpCode = MaxSdkUtils.GetIntFromDictionary(error, "cmpCode", -1),
|
|
CmpMessage = MaxSdkUtils.GetStringFromDictionary(error, "cmpMessage")
|
|
};
|
|
}
|
|
|
|
private static ErrorCode GetCode(int code)
|
|
{
|
|
switch (code)
|
|
{
|
|
case 1:
|
|
return ErrorCode.IntegrationError;
|
|
case 2:
|
|
return ErrorCode.FormUnavailable;
|
|
case 3:
|
|
return ErrorCode.FormNotRequired;
|
|
default:
|
|
return ErrorCode.Unspecified;
|
|
}
|
|
}
|
|
|
|
private MaxCmpError() { }
|
|
|
|
/// <summary>
|
|
/// The error code for this error.
|
|
/// </summary>
|
|
public ErrorCode Code { get; private set; }
|
|
|
|
/// <summary>
|
|
/// The error message for this error.
|
|
/// </summary>
|
|
public string Message { get; private set; }
|
|
|
|
/// <summary>
|
|
/// The error code returned by the CMP.
|
|
/// </summary>
|
|
public int CmpCode { get; private set; }
|
|
|
|
/// <summary>
|
|
/// The error message returned by the CMP.
|
|
/// </summary>
|
|
public string CmpMessage { get; private set; }
|
|
}
|