181 lines
7.5 KiB
C#
181 lines
7.5 KiB
C#
using System;
|
||
using System.Threading.Tasks;
|
||
using UnityEngine;
|
||
using UnityEngine.UI;
|
||
using TapTap.Login.Internal.Http;
|
||
using TapTap.Common;
|
||
using TapTap.Common.Internal.Utils;
|
||
using UnityEngine.EventSystems;
|
||
|
||
namespace TapTap.Login.Internal {
|
||
public class QRCodeController {
|
||
private readonly static string DEMO_IMAGE_CN_HOST = "https://sdk-assets.tds1.tapfiles.cn";
|
||
private readonly static string DEMO_IMAGE_URL_IOS_ZH = $"{DEMO_IMAGE_CN_HOST}/scan-guide/ios.png";
|
||
private readonly static string DEMO_IMAGE_URL_ANDROID_ZH = $"{DEMO_IMAGE_CN_HOST}/scan-guide/android.png";
|
||
|
||
private readonly static string DEMO_IMAGE_IO_HOST = "https://sdk-assets.ap-sg.tdsfiles.com";
|
||
private readonly static string DEMO_IMAGE_URL_IOS_EN = $"{DEMO_IMAGE_IO_HOST}/scan-guide/ios.png";
|
||
private readonly static string DEMO_IMAGE_URL_ANDROID_EN = $"{DEMO_IMAGE_IO_HOST}/scan-guide/android.png";
|
||
|
||
private readonly static string DEFAULT_IOS_CLIENT = "Sprites/taptap-login-ios-client";
|
||
private readonly static string DEFAULT_ANDROID_CLIENT = "Sprites/taptap-login-android-client";
|
||
|
||
private readonly static string AUTH_PENDING = "authorization_pending";
|
||
private readonly static string AUTH_WAITING = "authorization_waiting";
|
||
private readonly static string AUTH_DENIED = "access_denied";
|
||
private readonly static string AUTH_SUCCESS = "";
|
||
|
||
private readonly Action<TokenData> onAuth;
|
||
|
||
private readonly Text titleText;
|
||
private readonly RawImage qrcodeImage;
|
||
private readonly Text tipsText;
|
||
private readonly GameObject scanTips;
|
||
private readonly RawImage demoImage;
|
||
|
||
private readonly Button refreshButton;
|
||
|
||
private bool isRunning;
|
||
private QRCodeData qrcodeData;
|
||
|
||
private string clientId;
|
||
private string[] permissions;
|
||
|
||
public QRCodeController(Transform transform, Action<TokenData> onAuth) {
|
||
this.onAuth = onAuth;
|
||
|
||
titleText = transform.Find("Title").GetComponent<Text>();
|
||
qrcodeImage = transform.Find("QRCode/Image").GetComponent<RawImage>();
|
||
tipsText = transform.Find("Tips").GetComponent<Text>();
|
||
|
||
ClientButtonListener iOSButtonListener = transform.Find("Clients/iOSButton").GetComponent<ClientButtonListener>();
|
||
iOSButtonListener.GetComponent<Button>().onClick.AddListener(() => {
|
||
EventSystem.current.SetSelectedGameObject(null);
|
||
});
|
||
iOSButtonListener.OnMouseEnter = OnShowIOSDemoImage;
|
||
iOSButtonListener.OnMouseExit = OnCloseDemoImage;
|
||
ClientButtonListener androidButtonListener = transform.Find("Clients/AndroidButton").GetComponent<ClientButtonListener>();
|
||
androidButtonListener.OnMouseEnter = OnShowAndroidDemoImage;
|
||
androidButtonListener.OnMouseExit = OnCloseDemoImage;
|
||
androidButtonListener.GetComponent<Button>().onClick.AddListener(() => {
|
||
EventSystem.current.SetSelectedGameObject(null);
|
||
});
|
||
|
||
scanTips = transform.Find("ScanTips").gameObject;
|
||
demoImage = scanTips.transform.Find("DemoImage").GetComponent<RawImage>();
|
||
scanTips.SetActive(false);
|
||
|
||
refreshButton = transform.Find("QRCode/RefreshButton").GetComponent<Button>();
|
||
}
|
||
|
||
public void Load(string clientId, string[] permissions) {
|
||
this.clientId = clientId;
|
||
this.permissions = permissions;
|
||
|
||
ILoginLang lang = LoginLanguage.GetCurrentLang();
|
||
titleText.text = lang.QrTitleLogin();
|
||
tipsText.text = $"{lang.QrNoticeUse()} <b>TapTap</b> {lang.QrNoticeClient()}{lang.QrNoticeScanToLogin()}";
|
||
|
||
// 加载二维码
|
||
_ = RefreshQRCode(clientId, permissions);
|
||
}
|
||
|
||
public void Unload() {
|
||
isRunning = false;
|
||
}
|
||
|
||
private async Task RefreshQRCode(string clientId, string[] permissions) {
|
||
try {
|
||
refreshButton.gameObject.SetActive(false);
|
||
qrcodeData = await LoginService.GetQRCodeUrl(clientId, permissions);
|
||
qrcodeImage.texture = QRCodeUtils.EncodeQrImage(qrcodeData.Url, 320, 320);
|
||
|
||
// 加载二维码完成后再开启监听
|
||
_ = ListenScanQRCode(clientId);
|
||
|
||
await Task.Delay(qrcodeData.ExpiresIn * 1000);
|
||
|
||
// 过期暂停监听
|
||
isRunning = false;
|
||
ShowRefreshQRCode();
|
||
} catch (Exception) {
|
||
// 加载失败
|
||
ShowRefreshQRCode();
|
||
return;
|
||
}
|
||
}
|
||
|
||
private async Task ListenScanQRCode(string clientId) {
|
||
isRunning = true;
|
||
while (isRunning) {
|
||
if (qrcodeData == null) {
|
||
await Task.Delay(3 * 1000);
|
||
} else {
|
||
try {
|
||
TokenData tokenData = await LoginService.RequestScanQRCodeResult(clientId, qrcodeData.DeviceCode);
|
||
onAuth.Invoke(tokenData);
|
||
|
||
return ;
|
||
} catch (TapException e) {
|
||
ILoginLang lang = LoginLanguage.GetCurrentLang();
|
||
if (e.Message == AUTH_PENDING) {
|
||
|
||
} else if (e.Message == AUTH_WAITING) {
|
||
UI.UIManager.Instance.OpenToast(true,
|
||
$"{lang.QrnNoticeSuccess()},{lang.QrnNoticeSuccess2()}",
|
||
icon: UI.UIManager.WhiteToastSuccessIcon);
|
||
} else if (e.Message == AUTH_DENIED) {
|
||
UI.UIManager.Instance.OpenToast(true,
|
||
$"{lang.QrNoticeCancel()},{lang.QrNoticeCancel2()}",
|
||
icon: UI.UIManager.WhiteToastErrorIcon);
|
||
ShowRefreshQRCode();
|
||
}
|
||
await Task.Delay(qrcodeData.Interval * 1000);
|
||
} catch (Exception) {
|
||
await Task.Delay(qrcodeData.Interval * 1000);
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
private void OnShowIOSDemoImage() {
|
||
string url = DEMO_IMAGE_URL_IOS_ZH;
|
||
if (TapCommon.Config.RegionType == RegionType.IO) {
|
||
url = DEMO_IMAGE_URL_IOS_EN;
|
||
}
|
||
ShowDemoImage(url);
|
||
}
|
||
|
||
private void OnShowAndroidDemoImage() {
|
||
string url = DEMO_IMAGE_URL_ANDROID_ZH;
|
||
if (TapCommon.Config.RegionType == RegionType.IO) {
|
||
url = DEMO_IMAGE_URL_ANDROID_EN;
|
||
}
|
||
ShowDemoImage(url);
|
||
}
|
||
|
||
private async void ShowDemoImage(string url) {
|
||
demoImage.texture = null;
|
||
scanTips.SetActive(true);
|
||
try {
|
||
demoImage.texture = await ImageUtils.LoadImage(url);
|
||
} catch (Exception) {
|
||
demoImage.texture = null;
|
||
}
|
||
}
|
||
|
||
private void OnCloseDemoImage() {
|
||
scanTips.SetActive(false);
|
||
}
|
||
|
||
private void ShowRefreshQRCode() {
|
||
qrcodeImage.texture = null;
|
||
refreshButton.gameObject.SetActive(true);
|
||
refreshButton.onClick.RemoveAllListeners();
|
||
refreshButton.onClick.AddListener(() => {
|
||
_ = RefreshQRCode(clientId, permissions);
|
||
});
|
||
}
|
||
}
|
||
}
|