using UnityEngine; using System; using Laters; using System.Runtime.CompilerServices; using System.Threading.Tasks; namespace OneSignalSDK.Android.Utilities { public abstract class OneSignalAndroidJavaProxy : AndroidJavaProxy { private const string SDKPackage = "com.onesignal"; protected OneSignalAndroidJavaProxy(string listenerClassName) : base(SDKPackage + "." + listenerClassName) { } } public abstract class OneSignalAwaitableAndroidJavaProxy : AwaitableAndroidJavaProxy { private const string SDKPackage = "com.onesignal"; protected OneSignalAwaitableAndroidJavaProxy(string listenerClassName) : base(SDKPackage + "." + listenerClassName) { } } public sealed class Continuation { public AndroidJavaObject Proxy { get; } private AndroidConsumer _consumer; public Continuation() { var continuation = new AndroidJavaClass("com.onesignal.Continue"); _consumer = new AndroidConsumer(); Proxy = continuation.CallStatic("with", _consumer); } public TaskAwaiter GetAwaiter() => _consumer.GetAwaiter(); } public sealed class AndroidConsumer : AwaitableAndroidJavaProxy { public AndroidConsumer() : base("java.util.function.Consumer") { } public void accept(AndroidJavaObject obj) { var result = obj.Call("isSuccess"); if (result) { _complete(null); } else { var throwable = obj.Call("getThrowable"); if (throwable != null) { _fail(throwable.Call("getMessage")); } else { _fail("error with async method"); } } } } public sealed class BoolContinuation { public AndroidJavaObject Proxy { get; } private AndroidBoolConsumer _consumer; public BoolContinuation() { var continuation = new AndroidJavaClass("com.onesignal.Continue"); _consumer = new AndroidBoolConsumer(); Proxy = continuation.CallStatic("with", _consumer); } public TaskAwaiter GetAwaiter() => _consumer.GetAwaiter(); } public sealed class AndroidBoolConsumer : AwaitableAndroidJavaProxy { public AndroidBoolConsumer() : base("java.util.function.Consumer") { } public void accept(AndroidJavaObject obj) { var result = obj.Call("isSuccess"); if (result) { var data = obj.Call("getData"); var value = data.Call("booleanValue"); _complete(value); } else { var throwable = obj.Call("getThrowable"); if (throwable != null) _fail(throwable.Call("getMessage")); else _fail("error with async method"); } } } }