using System; using System.Collections.Generic; using System.Net; using System.Text; using Shared.Common; namespace Shared.Phone.UserCenter.Abount { /// /// 关于的画面 /// public class AbountForm : EditorCommonForm { #region ◆ 变量____________________________ /// /// 是否正在更新中 /// public bool isUpdating; /// /// The web client. /// public WebClient webClient = new WebClient { }; /// /// 更新中 /// public NormalViewControl btnUpdating; /// /// distributedMark /// public string distributedMark; /// /// updateRow /// public FrameRowControl rowUpdate; /// /// 下载安卓apk的byte长度 /// public long ApkBytesTotalLength = 0; #endregion /// /// 画面显示(底层会固定调用此方法,借以完成画面创建) /// public void ShowForm() { //设置标题信息 base.SetTitleText(Language.StringByID(R.MyInternationalizationString.uAboutMe)); //初始化中部控件 this.InitMiddleFrame(); } /// /// Closes the form. /// public override void CloseFormBefore() { #if Android SetDownLoadBtnNoVisible(); CancelDownLoadApkAsync(); base.CloseFormBefore(); #elif iOS base.CloseFormBefore(); #endif } /// /// 初始化中部控件 /// private void InitMiddleFrame() { //头部白色背景 var frameLogo = new FrameLayoutBase(); frameLogo.Height = Application.GetRealHeight(484); frameLogo.BackgroundColor = ZigbeeColor.Current.GXCBackgroundColor; bodyFrameLayout.AddChidren(frameLogo); //图标的容器 var frameLogoBackground = new FrameLayoutBase(); frameLogoBackground.Y = Application.GetRealHeight(104); frameLogoBackground.Width = this.GetPictrueRealSize(167); frameLogoBackground.Height = this.GetPictrueRealSize(167); frameLogoBackground.Gravity = Gravity.CenterHorizontal; frameLogoBackground.BackgroundColor = ZigbeeColor.Current.GXCButtonBlackSelectedColor; frameLogoBackground.Radius = (uint)Application.GetRealHeight(37); frameLogo.AddChidren(frameLogoBackground); //图标 var btnLogo = new IconViewControl(144); btnLogo.UnSelectedImagePath = "Account/Logo_White.png"; btnLogo.Gravity = Gravity.Center; frameLogoBackground.AddChidren(btnLogo); //HDL Home var btnName = new NormalViewControl(700, 60, true); btnName.Y = Application.GetRealHeight(294); btnName.Gravity = Gravity.CenterHorizontal; btnName.Text = "HDL Home"; btnName.TextSize = 15; btnName.TextColor = ZigbeeColor.Current.GXCTextDeepBlackColor; btnName.TextAlignment = TextAlignment.Center; frameLogo.AddChidren(btnName); //版本号 var btnVersion = new NormalViewControl(700, 50, true); btnVersion.Y = Application.GetRealHeight(366); btnVersion.Gravity = Gravity.CenterHorizontal; btnVersion.Text = $"{Language.StringByID(R.MyInternationalizationString.VersionCode)} {CommonPage.CodeIDString}"; btnVersion.TextSize = 12; btnVersion.TextColor = ZigbeeColor.Current.GXCTextGrayColor; btnVersion.TextAlignment = TextAlignment.Center; frameLogo.AddChidren(btnVersion); //列表控件 var listView = new FrameListControl(12); listView.Y = frameLogo.Bottom + Application.GetRealHeight(23); listView.BackgroundColor = UserCenterColor.Current.White; listView.Height = Application.GetRealHeight(500); bodyFrameLayout.AddChidren(listView); //服务协议 //var rowService = new FrameRowControl(listView.rowSpace / 2); //listView.AddChidren(rowService); //rowService.AddLeftCaption(Language.StringByID(R.MyInternationalizationString.SLA), 400); //rowService.AddRightArrow(); //rowService.AddBottomLine(); //版本更新 this.rowUpdate = new FrameRowControl(listView.rowSpace / 2); listView.AddChidren(rowUpdate); rowUpdate.AddLeftCaption(Language.StringByID(R.MyInternationalizationString.UpdateVersion), 400); rowUpdate.AddRightArrow(); var btnRightView = rowUpdate.AddMostRightView("", 400); rowUpdate.CanClick = false; rowUpdate.ButtonClickEvent += (sender, e) => { UpdateVersion(); }; //调整桌布高度 listView.AdjustRealHeight(Application.GetRealHeight(23)); //更新中 this.btnUpdating = new NormalViewControl(556, 106, true); btnUpdating.Y = Application.GetRealHeight(994); btnUpdating.Radius = (uint)Application.GetRealHeight(53); btnUpdating.BackgroundColor = ZigbeeColor.Current.GXCDailogBackGroundColor; btnUpdating.TextID = R.MyInternationalizationString.Updating; btnUpdating.TextSize = 15; btnUpdating.TextColor = ZigbeeColor.Current.GXCTextWhiteColor; btnUpdating.Gravity = Gravity.CenterHorizontal; btnUpdating.TextAlignment = TextAlignment.Center; bodyFrameLayout.AddChidren(btnUpdating); //设置进度控件不可见 this.SetDownLoadBtnNoVisible(); //检测新版本 HdlThreadLogic.Current.RunThread(async () => { var result = await CanUpdateAsync(); HdlThreadLogic.Current.RunMain(() => { if (result) { //更新最新版 btnRightView.TextID = R.MyInternationalizationString.Update; rowUpdate.CanClick = true; } else { btnRightView.TextID = R.MyInternationalizationString.TheAppVersionIsNewest; } }); }); } /// /// 设置进度控件不可见 /// private void SetDownLoadBtnNoVisible() { isUpdating = false; btnUpdating.Visible = false; } /// /// 设置进度控件可见 /// private void SetDownLoadBtnVisible() { isUpdating = true; btnUpdating.Visible = true; rowUpdate.CanClick = false; } /// /// 检查版本 /// /// private async System.Threading.Tasks.Task 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.CompareTo(CommonPage.CodeIDString) > 0) { 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 } /// /// 更新 /// 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(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 /// /// 获取iOS-APP版本信息 /// /// The https app version async. public async System.Threading.Tasks.Task 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(Encoding.UTF8.GetString(result)); } catch { return null; } } /// /// 跳转到APP Store /// 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 /// /// Install the specified context. /// /// Context. 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); } /// /// 获取 Android-APP 版本信息 /// /// The https app version async. private async System.Threading.Tasks.Task 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(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; } } /// /// 下载安装apk /// /// The load apk async. /// 请求链接 /// 请求参数 private System.Threading.Tasks.Task 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 { } } /// /// apk下载进度 /// /// Sender. /// E. 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(); btnUpdating.Text = $"{ Language.StringByID(R.MyInternationalizationString.Updating)} {(int)(e.BytesReceived / (float)ApkBytesTotalLength * 100)}%"; }); } } /// /// Client_UploadCompleted /// /// /// void Client_UploadCompleted(object sender, UploadDataCompletedEventArgs e) { System.Console.WriteLine("下载apk完成"); SetDownLoadBtnNoVisible(); } /// /// 取消下载apk /// private void CancelDownLoadApkAsync() { webClient?.CancelAsync(); SetDownLoadBtnNoVisible(); System.Console.WriteLine("取消下载apk"); } #endif } }