You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
75 lines
2.5 KiB
C#
75 lines
2.5 KiB
C#
#if UNITY_ANDROID && !UNITY_EDITOR
|
|
|
|
using System;
|
|
using System.Threading;
|
|
using System.Threading.Tasks;
|
|
using UnityEngine;
|
|
|
|
namespace Thirdweb.Unity
|
|
{
|
|
public class AndroidBrowser : IThirdwebBrowser
|
|
{
|
|
private TaskCompletionSource<BrowserResult> _taskCompletionSource;
|
|
|
|
private string _customScheme;
|
|
|
|
public async Task<BrowserResult> Login(ThirdwebClient client, string loginUrl, string customScheme, Action<string> browserOpenAction, CancellationToken cancellationToken = default)
|
|
{
|
|
_taskCompletionSource = new TaskCompletionSource<BrowserResult>();
|
|
|
|
cancellationToken.Register(() =>
|
|
{
|
|
_taskCompletionSource?.TrySetCanceled();
|
|
});
|
|
|
|
_customScheme = customScheme;
|
|
|
|
Application.deepLinkActivated += OnDeepLinkActivated;
|
|
|
|
try
|
|
{
|
|
OpenURL(loginUrl);
|
|
var completedTask = await Task.WhenAny(_taskCompletionSource.Task, Task.Delay(TimeSpan.FromSeconds(120)));
|
|
if (completedTask == _taskCompletionSource.Task)
|
|
{
|
|
return await _taskCompletionSource.Task;
|
|
}
|
|
else
|
|
{
|
|
return new BrowserResult(BrowserStatus.Timeout, null, "The operation timed out.");
|
|
}
|
|
}
|
|
catch (TaskCanceledException)
|
|
{
|
|
return new BrowserResult(BrowserStatus.UserCanceled, null, "The operation was cancelled.");
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
return new BrowserResult(BrowserStatus.UnknownError, null, $"An error occurred: {ex.Message}");
|
|
}
|
|
finally
|
|
{
|
|
Application.deepLinkActivated -= OnDeepLinkActivated;
|
|
}
|
|
}
|
|
|
|
private void OpenURL(string url)
|
|
{
|
|
using var thirdwebPluginClass = new AndroidJavaClass("com.thirdweb.unity.ThirdwebAndroidPlugin");
|
|
using var unityPlayerClass = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
|
|
using var currentActivity = unityPlayerClass.GetStatic<AndroidJavaObject>("currentActivity");
|
|
thirdwebPluginClass.CallStatic("OpenCustomTab", currentActivity, url);
|
|
}
|
|
|
|
private void OnDeepLinkActivated(string url)
|
|
{
|
|
if (_taskCompletionSource.Task.IsCanceled || !url.StartsWith(_customScheme))
|
|
return;
|
|
|
|
_taskCompletionSource.TrySetResult(new BrowserResult(BrowserStatus.Success, url));
|
|
}
|
|
}
|
|
}
|
|
|
|
#endif
|