using Android.Gms.Tasks; namespace Massenger.Client; internal static class AndroidTaskExtensions { public static Task AsStringAsync(this Android.Gms.Tasks.Task task, System.Threading.CancellationToken cancellationToken = default) { var taskCompletionSource = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); if (cancellationToken.CanBeCanceled) { cancellationToken.Register(() => taskCompletionSource.TrySetCanceled(cancellationToken)); } task.AddOnCompleteListener(new TaskCompletionListener(taskCompletionSource)); return taskCompletionSource.Task; } private sealed class TaskCompletionListener(TaskCompletionSource taskCompletionSource) : Java.Lang.Object, IOnCompleteListener { public void OnComplete(Android.Gms.Tasks.Task task) { if (task.IsCanceled) { taskCompletionSource.TrySetCanceled(); return; } if (!task.IsSuccessful) { taskCompletionSource.TrySetException(new InvalidOperationException(task.Exception?.Message ?? "Android task failed.")); return; } taskCompletionSource.TrySetResult(task.Result?.ToString()); } } }