Files
Massenger/src/Massenger.Client/Platforms/Android/AndroidTaskExtensions.cs
2026-03-13 21:01:04 +03:00

41 lines
1.3 KiB
C#

using Android.Gms.Tasks;
namespace Massenger.Client;
internal static class AndroidTaskExtensions
{
public static Task<string?> AsStringAsync(this Android.Gms.Tasks.Task task, System.Threading.CancellationToken cancellationToken = default)
{
var taskCompletionSource = new TaskCompletionSource<string?>(TaskCreationOptions.RunContinuationsAsynchronously);
if (cancellationToken.CanBeCanceled)
{
cancellationToken.Register(() => taskCompletionSource.TrySetCanceled(cancellationToken));
}
task.AddOnCompleteListener(new TaskCompletionListener(taskCompletionSource));
return taskCompletionSource.Task;
}
private sealed class TaskCompletionListener(TaskCompletionSource<string?> 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());
}
}
}