109 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			C#
		
	
	
	
			
		
		
	
	
			109 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			C#
		
	
	
	
| //
 | |
| //  MaxEventExecutor.cs
 | |
| //  Max Unity Plugin
 | |
| //
 | |
| //  Created by Jonathan Liu on 1/22/2024.
 | |
| //  Copyright © 2024 AppLovin. All rights reserved.
 | |
| //
 | |
| 
 | |
| using System;
 | |
| using System.Collections.Generic;
 | |
| using UnityEngine;
 | |
| using UnityEngine.Events;
 | |
| 
 | |
| namespace AppLovinMax.Internal
 | |
| {
 | |
|     public class MaxEventExecutor : MonoBehaviour
 | |
|     {
 | |
|         private static MaxEventExecutor _instance;
 | |
|         private static readonly List<MaxAction> AdEventsQueue = new List<MaxAction>();
 | |
| 
 | |
|         private static volatile bool _adEventsQueueEmpty = true;
 | |
| 
 | |
|         struct MaxAction
 | |
|         {
 | |
|             public readonly Action ActionToExecute;
 | |
|             public readonly string EventName;
 | |
| 
 | |
|             public MaxAction(Action actionToExecute, string nameOfEvent)
 | |
|             {
 | |
|                 ActionToExecute = actionToExecute;
 | |
|                 EventName = nameOfEvent;
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         public static void InitializeIfNeeded()
 | |
|         {
 | |
|             if (_instance != null) return;
 | |
| 
 | |
|             var executor = new GameObject("MaxEventExecutor");
 | |
|             executor.hideFlags = HideFlags.HideAndDontSave;
 | |
|             DontDestroyOnLoad(executor);
 | |
|             _instance = executor.AddComponent<MaxEventExecutor>();
 | |
|         }
 | |
| 
 | |
|         #region Public API
 | |
| 
 | |
| #if UNITY_EDITOR || !(UNITY_ANDROID || UNITY_IPHONE || UNITY_IOS)
 | |
|         public static MaxEventExecutor Instance
 | |
|         {
 | |
|             get
 | |
|             {
 | |
|                 InitializeIfNeeded();
 | |
|                 return _instance;
 | |
|             }
 | |
|         }
 | |
| #endif
 | |
| 
 | |
|         public static void ExecuteOnMainThread(Action action, string eventName)
 | |
|         {
 | |
|             lock (AdEventsQueue)
 | |
|             {
 | |
|                 AdEventsQueue.Add(new MaxAction(action, eventName));
 | |
|                 _adEventsQueueEmpty = false;
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         public static void InvokeOnMainThread(UnityEvent unityEvent, string eventName)
 | |
|         {
 | |
|             ExecuteOnMainThread(() => unityEvent.Invoke(), eventName);
 | |
|         }
 | |
| 
 | |
|         #endregion
 | |
| 
 | |
|         public void Update()
 | |
|         {
 | |
|             if (_adEventsQueueEmpty) return;
 | |
| 
 | |
|             var actionsToExecute = new List<MaxAction>();
 | |
|             lock (AdEventsQueue)
 | |
|             {
 | |
|                 actionsToExecute.AddRange(AdEventsQueue);
 | |
|                 AdEventsQueue.Clear();
 | |
|                 _adEventsQueueEmpty = true;
 | |
|             }
 | |
| 
 | |
|             foreach (var maxAction in actionsToExecute)
 | |
|             {
 | |
|                 if (maxAction.ActionToExecute.Target != null)
 | |
|                 {
 | |
|                     try
 | |
|                     {
 | |
|                         maxAction.ActionToExecute.Invoke();
 | |
|                     }
 | |
|                     catch (Exception exception)
 | |
|                     {
 | |
|                         MaxSdkLogger.UserError("Caught exception in publisher event: " + maxAction.EventName + ", exception: " + exception);
 | |
|                         MaxSdkLogger.LogException(exception);
 | |
|                     }
 | |
|                 }
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         public void Disable()
 | |
|         {
 | |
|             _instance = null;
 | |
|         }
 | |
|     }
 | |
| }
 |