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; }
 | 
						|
}
 |