41 lines
1.3 KiB
C#
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());
|
|
}
|
|
}
|
|
}
|