using System;
|
using System.Collections.Generic;
|
using System.Net;
|
using System.Runtime.Remoting.Contexts;
|
using System.Text;
|
using Shared.Common;
|
using Shared.Phone.Device.CommonForm;
|
namespace Shared.Phone.UserCenter.Abount
|
{
|
/// <summary>
|
/// 关于的画面
|
/// </summary>
|
public class AbountForm : EditorCommonForm
|
{
|
#region ◆ 变量____________________________
|
/// <summary>
|
/// 是否正在更新中
|
/// </summary>
|
public bool isUpdating;
|
/// <summary>
|
/// The web client.
|
/// </summary>
|
public WebClient webClient=new WebClient { };
|
/// <summary>
|
/// 更新中
|
/// </summary>
|
public Button updatingBtn;
|
/// <summary>
|
/// distributedMark
|
/// </summary>
|
public string distributedMark;
|
/// <summary>
|
/// updateRow
|
/// </summary>
|
public DeviceInfoRow updateRow;
|
/// <summary>
|
/// 下载安卓apk的byte长度
|
/// </summary>
|
public long ApkBytesTotalLength = 0;
|
|
#endregion
|
|
/// <summary>
|
/// Initializes a new instance of the <see cref="T:Shared.Phone.UserCenter.Abount.AbountForm"/> class.
|
/// </summary>
|
public AbountForm()
|
{
|
|
}
|
/// <summary>
|
/// 画面显示(底层会固定调用此方法,借以完成画面创建)
|
/// </summary>
|
public void ShowForm()
|
{
|
//设置标题信息
|
base.SetTitleText(Language.StringByID(R.MyInternationalizationString.uAboutMe));
|
//初始化中部控件
|
this.InitMiddleFrame();
|
}
|
/// <summary>
|
/// Closes the form.
|
/// </summary>
|
public override void CloseFormBefore()
|
{
|
#if Android
|
//if (isUpdating == true)
|
//{
|
//var alert = new Alert(Language.StringByID(R.MyInternationalizationString.TIP), Language.StringByID(R.MyInternationalizationString.CancelUpdating), Language.StringByID(R.MyInternationalizationString.Cancel), Language.StringByID(R.MyInternationalizationString.Confrim));
|
//alert.Show();
|
//alert.ResultEventHandler += (send, e) =>
|
//{
|
// if (e)
|
// {
|
SetDownLoadBtnNoVisible();
|
CancelDownLoadApkAsync();
|
base.CloseFormBefore();
|
//}
|
// else
|
// {
|
// return;
|
// }
|
// };
|
//}
|
//else
|
//{
|
// base.CloseFormBefore();
|
//}
|
#elif iOS
|
base.CloseFormBefore();
|
#endif
|
}
|
/// <summary>
|
/// 初始化中部控件
|
/// </summary>
|
private void InitMiddleFrame()
|
{
|
bodyFrameLayout.BackgroundColor = ZigbeeColor.Current.GXCGrayBackgroundColor;
|
var logoFrameLayout = new FrameLayout
|
{
|
Height = Application.GetRealHeight(484),
|
BackgroundColor = ZigbeeColor.Current.GXCBackgroundColor
|
};
|
bodyFrameLayout.AddChidren(logoFrameLayout);
|
|
var logoBackground = new FrameLayout
|
{
|
Y = Application.GetRealHeight(104),
|
Width = Application.GetMinRealAverage(167),
|
Height = Application.GetMinRealAverage(167),
|
Gravity = Gravity.CenterHorizontal,
|
BackgroundColor = ZigbeeColor.Current.GXCButtonBlackSelectedColor,
|
Radius = (uint)Application.GetRealHeight(37),
|
};
|
logoFrameLayout.AddChidren(logoBackground);
|
|
var logoBtn = new Button()
|
{
|
Width = Application.GetMinRealAverage(144),
|
Height = Application.GetMinRealAverage(144),
|
UnSelectedImagePath = "Account/Logo_White.png",
|
Gravity = Gravity.Center
|
};
|
logoBackground.AddChidren(logoBtn);
|
|
var nameBtn = new Button()
|
{
|
Y = Application.GetRealHeight(294),
|
Width = Application.GetRealWidth(700),
|
Height = Application.GetRealHeight(60),
|
Gravity = Gravity.CenterHorizontal,
|
Text = "HDL Home",
|
TextSize = 15,
|
TextColor = ZigbeeColor.Current.GXCTextDeepBlackColor
|
};
|
logoFrameLayout.AddChidren(nameBtn);
|
|
var versionBtn = new Button()
|
{
|
Y = Application.GetRealHeight(366),
|
Width = Application.GetRealWidth(700),
|
Height = Application.GetRealHeight(50),
|
Gravity = Gravity.CenterHorizontal,
|
Text = $"{Language.StringByID(R.MyInternationalizationString.VersionCode)} {CommonPage.CodeIDString}",
|
TextSize = 12,
|
TextColor = ZigbeeColor.Current.GXCTextGrayColor
|
};
|
logoFrameLayout.AddChidren(versionBtn);
|
|
|
var versionFL = new FrameLayout
|
{
|
Y = Application.GetRealHeight(510),
|
Height = Application.GetRealHeight(300),
|
BackgroundColor = ZigbeeColor.Current.GXCBackgroundColor
|
};
|
bodyFrameLayout.AddChidren(versionFL);
|
|
var SLARow = new DeviceInfoRow(12);
|
SLARow.Init();
|
SLARow.SetTipTitle(R.MyInternationalizationString.SLA);
|
SLARow.NameText.TextAlignment = TextAlignment.CenterRight;
|
versionFL.AddChidren(SLARow);
|
SLARow.ClickBtn.MouseUpEventHandler += (sender, e) =>
|
{
|
var slaForm = new SLAForm();
|
slaForm.AddForm();
|
};
|
|
updateRow = new DeviceInfoRow(12 + 127 + 12);
|
updateRow.Init();
|
updateRow.SetTipTitle(R.MyInternationalizationString.UpdateVersion);
|
updateRow.NameText.TextAlignment = TextAlignment.CenterRight;
|
updateRow.HideLine(true);
|
updateRow.SetTitle(R.MyInternationalizationString.TheAppVersionIsNewest);
|
updateRow.CanClick(false);
|
updateRow.SetTitleColor(ZigbeeColor.Current.GXCTextGrayColor);
|
versionFL.AddChidren(updateRow);
|
updateRow.ClickBtn.MouseUpEventHandler += (sender, e) =>
|
{
|
UpdateVersion();
|
};
|
|
|
updatingBtn = new Button()
|
{
|
Y = Application.GetRealHeight(994),
|
Width = Application.GetRealWidth(556),
|
Height = Application.GetRealHeight(106),
|
Radius=(uint)Application.GetRealHeight(53),
|
BackgroundColor=ZigbeeColor.Current.GXCDailogBackGroundColor,
|
TextID = R.MyInternationalizationString.Updating,
|
TextSize=15,
|
TextColor = ZigbeeColor.Current.GXCTextWhiteColor,
|
Gravity=Gravity.CenterHorizontal
|
};
|
bodyFrameLayout.AddChidren(updatingBtn);
|
|
SetDownLoadBtnNoVisible();
|
CheckVersion();
|
}
|
|
/// <summary>
|
/// CheckVersion
|
/// </summary>
|
private void CheckVersion()
|
{
|
new System.Threading.Thread(async () =>
|
{
|
var re = await CanUpdateAsync();
|
if (re)
|
{
|
Application.RunOnMainThread(() =>
|
{
|
updateRow.CanClick(true);
|
updateRow.SetTitleColor(ZigbeeColor.Current.GXCButtonSelectedColor);
|
updateRow.SetTitle(R.MyInternationalizationString.Update);
|
});
|
}
|
})
|
{ IsBackground = true }.Start();
|
|
}
|
/// <summary>
|
/// 设置进度控件不可见
|
/// </summary>
|
private void SetDownLoadBtnNoVisible()
|
{
|
isUpdating = false;
|
updatingBtn.Visible = false;
|
}
|
/// <summary>
|
/// 设置进度控件可见
|
/// </summary>
|
private void SetDownLoadBtnVisible()
|
{
|
isUpdating = true;
|
updatingBtn.Visible = true;
|
updateRow.CanClick(false);
|
}
|
|
/// <summary>
|
/// 检查版本
|
/// </summary>
|
/// <returns></returns>
|
private async System.Threading.Tasks.Task<bool> CanUpdateAsync()
|
{
|
#if iOS
|
try
|
{
|
var versionResult = await RequestHttpsiOSAppVersionAsync();
|
if (versionResult == null || versionResult.Results == null)
|
{
|
return false;
|
}
|
var results = Newtonsoft.Json.Linq.JArray.Parse(versionResult.Results.ToString());
|
if (results[0] == null)
|
{
|
return false;
|
}
|
var newVersion = results[0]["version"]?.ToString();
|
var updateContent = results[0]["releaseNotes"]?.ToString();
|
if (newVersion != CommonPage.CodeIDString)
|
{
|
return true;
|
}
|
return false;
|
}
|
catch
|
{
|
return false;
|
}
|
|
#elif Android
|
try
|
{
|
var versionResult = await RequestHttpsAndroidAppVersionAsync();
|
if (versionResult == null)
|
{
|
return false;
|
}
|
if (int.Parse(versionResult.FirmwareVersion.Replace(".", "")) > int.Parse(CommonPage.CodeIDString.Replace(".", "")))
|
{
|
distributedMark = versionResult.DistributedMark;
|
return true;
|
}
|
return false;
|
}
|
catch (Exception ex)
|
{
|
return false;
|
}
|
#endif
|
}
|
|
/// <summary>
|
/// 更新
|
/// </summary>
|
private async void UpdateVersion()
|
{
|
#if iOS
|
OpenUrl();
|
#elif Android
|
try
|
{
|
var requestObj = new SendDataToServer.DownLoadAndroidApk
|
{
|
RequestVersion = CommonPage.RequestVersion,
|
DistributedMark = distributedMark
|
};
|
var requestJson = Newtonsoft.Json.JsonConvert.SerializeObject(requestObj);
|
|
var bytesTotalLengthResult = await CommonPage.Instance.RequestHttpsZigbeeAsync("FirmwareMana/DownloadPlatformUploadFirmwarePreLength", Encoding.UTF8.GetBytes(requestJson));
|
if (bytesTotalLengthResult == null || bytesTotalLengthResult.ResponseData == null)
|
{
|
CommonPage.Instance.ShowErrorInfoAlert(R.MyInternationalizationString.UpdateAppFail);
|
return;
|
}
|
var bytesTotalLength = Newtonsoft.Json.JsonConvert.DeserializeObject<long>(bytesTotalLengthResult.ResponseData.ToString());
|
if (bytesTotalLength == 0)
|
{
|
CommonPage.Instance.ShowErrorInfoAlert(R.MyInternationalizationString.UpdateAppFail);
|
return;
|
}
|
ApkBytesTotalLength = bytesTotalLength;
|
var bytes = await DownLoadApkAsync("FirmwareMana/DownloadPlatformUploadFirmware", Encoding.UTF8.GetBytes(requestJson));
|
if (bytes == null)
|
{
|
CommonPage.Instance.ShowErrorInfoAlert(R.MyInternationalizationString.UpdateAppFail);
|
return;
|
}
|
if (bytes.ToString().Contains("DownloadFail"))
|
{
|
CommonPage.Instance.ShowErrorInfoAlert(R.MyInternationalizationString.FailedPleaseTryAgain);
|
return;
|
}
|
var path = System.IO.Path.Combine(Shared.IO.FileUtils.RootPath, "home.apk");
|
Shared.IO.FileUtils.WriteFileByBytes(path, bytes);
|
Install(Shared.Application.Activity);
|
}
|
catch (Exception ex)
|
{
|
System.Console.WriteLine($"下载失败--{ex.Message}");
|
}
|
#endif
|
}
|
|
#if iOS
|
/// <summary>
|
/// 获取iOS-APP版本信息
|
/// </summary>
|
/// <returns>The https app version async.</returns>
|
public async System.Threading.Tasks.Task<Common.ResponseEntity.ResultPack> RequestHttpsiOSAppVersionAsync()
|
{
|
try
|
{
|
var webClient = new WebClient { };
|
var result = await webClient.DownloadDataTaskAsync("https://itunes.apple.com/lookup?id=1461693569");
|
if (result == null)
|
{
|
return null;
|
}
|
return Newtonsoft.Json.JsonConvert.DeserializeObject<Common.ResponseEntity.ResultPack>(Encoding.UTF8.GetString(result));
|
}
|
catch
|
{
|
return null;
|
}
|
}
|
/// <summary>
|
/// 跳转到APP Store
|
/// </summary>
|
public void OpenUrl()
|
{
|
Uri url = new Uri("https://itunes.apple.com/cn/app/hdl-home/id1461693569?mt=8");
|
UIKit.UIApplication.SharedApplication.OpenUrl(url);
|
}
|
#elif Android
|
|
/// <summary>
|
/// Install the specified context.
|
/// </summary>
|
/// <param name="context">Context.</param>
|
private static void Install(Android.Content.Context context)
|
{
|
|
//var file = new Java.IO.File(Android.OS.Environment.GetExternalStoragePublicDirectory(Android.OS.Environment.DirectoryDownloads), "home.apk");
|
var file = new Java.IO.File(System.IO.Path.Combine(Shared.IO.FileUtils.RootPath, "home.apk"));
|
var intent = new Android.Content.Intent(Android.Content.Intent.ActionInstallPackage);
|
// 由于没有在Activity环境下启动Activity,设置下面的标签
|
intent.SetFlags(Android.Content.ActivityFlags.NewTask);
|
|
if (Android.OS.BuildVersionCodes.M < Android.OS.Build.VERSION.SdkInt)
|
{
|
//参数1 上下文, 参数2 Provider主机地址 和配置文件中保持一致 参数3 共享的文件
|
var apkUri = Android.Support.V4.Content.FileProvider.GetUriForFile(context, "com.hdl.home.fileProvider", file);
|
//添加这一句表示对目标应用临时授权该Uri所代表的文件
|
intent.AddFlags(Android.Content.ActivityFlags.GrantReadUriPermission);
|
intent.SetDataAndType(apkUri, "application/vnd.android.package-archive");
|
}
|
else
|
{
|
intent.SetDataAndType(Android.Net.Uri.FromFile(file), "application/vnd.android.package-archive");
|
}
|
context.StartActivity(intent);
|
}
|
|
/// <summary>
|
/// 获取 Android-APP 版本信息
|
/// </summary>
|
/// <returns>The https app version async.</returns>
|
private async System.Threading.Tasks.Task<Common.ResponseEntity.ApkInfoOBJ> RequestHttpsAndroidAppVersionAsync()
|
{
|
try
|
{
|
var requestOBJ = new SendDataToServer.GetAndroidApkInfoOBJ
|
{
|
Name = "ZigbeeApp",
|
RequestVersion = CommonPage.CodeIDString
|
};
|
var requestJson = Newtonsoft.Json.JsonConvert.SerializeObject(requestOBJ);
|
var result = await CommonPage.Instance.RequestHttpsZigbeeAsync("FirmwareMana/DetectionPlatformUploadFirmware", System.Text.Encoding.UTF8.GetBytes(requestJson));
|
if (result == null)
|
{
|
return null;
|
}
|
if (result.StateCode.ToUpper() == "SUCCESS")
|
{
|
if (result.ResponseData == null)
|
{
|
return null;
|
}
|
|
var responeData = Newtonsoft.Json.JsonConvert.DeserializeObject<Common.ResponseEntity.ApkInfoRes>(result.ResponseData.ToString());
|
if (responeData == null || responeData.pageData == null || responeData.pageData.Count == 0)
|
{
|
return null;
|
}
|
int MaxIndex = 0;
|
int NewVersion = 0;
|
for (int i = 0; i < responeData.pageData.Count; i++)
|
{
|
var apkInfo = responeData.pageData[i];
|
var version = int.Parse(apkInfo.FirmwareVersion.Replace(".", ""));
|
if (version > NewVersion)
|
{
|
NewVersion = version;
|
MaxIndex = i;
|
}
|
}
|
return responeData.pageData[MaxIndex];
|
}
|
return null;
|
}
|
catch (Exception ex)
|
{
|
return null;
|
}
|
}
|
|
/// <summary>
|
/// 下载安装apk
|
/// </summary>
|
/// <returns>The load apk async.</returns>
|
/// <param name="requestUrl">请求链接</param>
|
/// <param name="byteData">请求参数</param>
|
private System.Threading.Tasks.Task<byte[]> DownLoadApkAsync(string requestUrl, byte[] byteData)
|
{
|
try
|
{
|
webClient.Headers.Add(HttpRequestHeader.ContentType, "application/json");
|
webClient.Headers.Add(HttpRequestHeader.Authorization, Config.Instance.Token);
|
webClient.UploadProgressChanged += Client_DownloadProgressChanged;
|
webClient.UploadDataCompleted += Client_UploadCompleted;
|
var result = webClient.UploadDataTaskAsync($"{CommonPage.RequestHttpsHost}/{requestUrl}", "POST", byteData);
|
if (result == null)
|
{
|
return null;
|
}
|
return result;
|
}
|
catch (Exception ex)
|
{
|
return null;
|
}
|
finally
|
{
|
}
|
}
|
/// <summary>
|
/// apk下载进度
|
/// </summary>
|
/// <param name="sender">Sender.</param>
|
/// <param name="e">E.</param>
|
void Client_DownloadProgressChanged(object sender, UploadProgressChangedEventArgs e)
|
{
|
//System.Console.WriteLine($"当前进度--{(int)(e.BytesReceived / (float)ApkBytesTotalLength * 100)} % --BytesReceived--{e.BytesReceived}--totalByte{e.TotalBytesToReceive}");
|
if (e.BytesReceived <= ApkBytesTotalLength)
|
{
|
Application.RunOnMainThread(() =>
|
{
|
SetDownLoadBtnVisible();
|
updatingBtn.Text = $"{ Language.StringByID(R.MyInternationalizationString.Updating)} {(int)(e.BytesReceived / (float)ApkBytesTotalLength * 100)}%";
|
});
|
}
|
}
|
|
/// <summary>
|
/// Client_UploadCompleted
|
/// </summary>
|
/// <param name="sender"></param>
|
/// <param name="e"></param>
|
void Client_UploadCompleted(object sender, UploadDataCompletedEventArgs e)
|
{
|
System.Console.WriteLine("下载apk完成");
|
SetDownLoadBtnNoVisible();
|
}
|
/// <summary>
|
/// 取消下载apk
|
/// </summary>
|
private void CancelDownLoadApkAsync()
|
{
|
webClient?.CancelAsync();
|
SetDownLoadBtnNoVisible();
|
System.Console.WriteLine("取消下载apk");
|
}
|
#endif
|
|
}
|
}
|