#if UNITY_ANDROID //&& !UNITY_EDITOR using System; using System.Collections.Generic; using Azerion.BlueStack.API; using Azerion.BlueStack.Internal; using UnityEngine; namespace Azerion.BlueStack.Platforms.Android { public class BlueStackClient : AndroidJavaProxy, IBlueStackClient { private Action sdkInitCompleteAction; private Action adaptersInitCompleteAction; public static BlueStackClient Instance { get; } = new BlueStackClient(); private BlueStackClient() : base(BlueStackNativeClassNames.BlueStackInitializationListener) { } /* public void onMNGAdsSDKFactoryDidFinishInitializing() { var status = new SDKInitializationStatus(true, "BlueStack is successfully initialized"); // Set pref as cross platform client var crossPlatformClientSetup = AndroidJavaObjectFactory.Instance.CreateCrossPlatformClientSetupAndroidJavaObject(); crossPlatformClientSetup.Call("setPlatformPref"); sdkInitCompleteAction?.Invoke(status); } public void onMNGAdsSDKFactoryDidFailInitialization(AndroidJavaObject exception) { string message = exception.Call("getMessage"); var status = new SDKInitializationStatus(false, message); sdkInitCompleteAction?.Invoke(status); } public void onMNGAdsSDKFactoryAdapterInitializationStatus(AndroidJavaObject initializationStatus) { AndroidJavaObject mAdaptersStatus = initializationStatus.Call("getAdapterStatus"); int count = mAdaptersStatus.Call("size"); Dictionary adapterMap = new Dictionary(); for (int i = 0; i < count; i++) { AndroidJavaObject mStatus = mAdaptersStatus.Call("get", i); string provider = mStatus.Call("getProvider"); string description = mStatus.Call("getDescriptionStatus"); string stateString = mStatus.Call("getState").Call("toString"); AdapterState state = AdapterState.Unknown; switch (stateString) { case "READY": state = AdapterState.Ready; break; case "NOT_READY": state = AdapterState.NotReady; break; case "UNKNOWN": state = AdapterState.Unknown; break; } //AdapterState state = (AdapterState)mStatus.Call("getState").Call("ordinal"); adapterMap.Add(provider, new AdapterStatus(state, description, provider)); } adaptersInitCompleteAction?.Invoke(new InitializationStatusClient(adapterMap)); } */ // Callback for initialization success public void onInitialized(AndroidJavaObject initializationStatus) { try { var adapterStatusMap = initializationStatus.Call("getAdapterStatusMap"); var iterator = adapterStatusMap.Call("entrySet").Call("iterator"); Dictionary adapterMap = new Dictionary(); Boolean isAnyAdapterReady = false; while (iterator.Call("hasNext")) { var entry = iterator.Call("next"); var adapterStatus = entry.Call("getValue"); string name = adapterStatus.Call("getName"); string stateString = adapterStatus.Call("getState").Call("toString"); AdapterState adapterState = AdapterState.Unknown; switch (stateString) { case "READY": adapterState = AdapterState.Ready; isAnyAdapterReady = true; break; case "NOT_READY": adapterState = AdapterState.NotReady; break; case "UNKNOWN": adapterState = AdapterState.Unknown; break; } string state = adapterState.ToString(); string description = adapterStatus.Call("getDescription"); Debug.Log($"Adapter: {name}, State: {state}, Description: {description}"); adapterMap.Add(name, new AdapterStatus(adapterState, description, name)); // if (name == "mngPerf" && adapterState == AdapterState.Ready) // { // isSDKInitialized = true; // } } if (adapterMap.Count > 0) { if (isAnyAdapterReady) { adaptersInitCompleteAction?.Invoke(new InitializationStatusClient(adapterMap)); var status = new SDKInitializationStatus(true, "BlueStack is successfully initialized"); sdkInitCompleteAction?.Invoke(status); } else { var status = new SDKInitializationStatus(false, GetAdapterDescription(adapterMap, "mngPerf")); sdkInitCompleteAction?.Invoke(status); } } else { var status = new SDKInitializationStatus(false, "Adapters are not initialized"); sdkInitCompleteAction?.Invoke(status); } } catch (Exception e) { Debug.LogError($"Error parsing initialization status: {e}"); var status = new SDKInitializationStatus(false, e.Message); sdkInitCompleteAction?.Invoke(status); } } private static string GetAdapterDescription(Dictionary adapterMap, string adapterName) { if (adapterMap.TryGetValue(adapterName, out AdapterStatus adapterStatus)) { return adapterStatus.Description; } return "Adapter not ready"; } private static AdapterState GetAdapterState(Dictionary adapterMap, string adapterName) { if (adapterMap.TryGetValue(adapterName, out AdapterStatus adapterStatus)) { return adapterStatus.InitializationState; } return AdapterState.Unknown; } public void Initialize(string appId, Settings settings, Action sdkInitCompleteAction, Action adaptersInitCompleteAction) { // Set pref as cross platform client var crossPlatformClientSetup = AndroidJavaObjectFactory.Instance.CreateCrossPlatformClientSetupAndroidJavaObject(); AndroidJavaObjectFactory.Instance.RunOnUiThread(() => { crossPlatformClientSetup.Call("setPlatformPref"); }); this.sdkInitCompleteAction = sdkInitCompleteAction; this.adaptersInitCompleteAction = adaptersInitCompleteAction; var playerClass = new AndroidJavaClass(BlueStackNativeClassNames.UnityActivityClassName); var activity = playerClass.GetStatic("currentActivity"); var blueStackClass = new AndroidJavaClass(BlueStackNativeClassNames.BlueStackClassName); var blueStackInstance = blueStackClass.GetStatic("INSTANCE"); AndroidJavaObjectFactory.Instance.RunOnUiThread(() => { blueStackInstance.Call("setDebugModeEnabled", settings.IsDebugModeEnabled); blueStackInstance.Call("initialize", activity, appId, this); }); } } } #endif