CrabtreeOn,印度客户定制APP,迁移2.0平台版本
陈嘉乐
2021-01-12 f382eaff90d5126387b5616b602b4168b37ad21c
Merge branch 'master' into wjc
9个文件已修改
1696 ■■■■■ 已修改文件
Crabtree/ON.Ios/AppDelegate.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Crabtree/ON/Application.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Crabtree/SmartHome/HDL/Common/CommonUtlis.cs 367 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Crabtree/SmartHome/HDL/Common/HttpUtil/HttpServerRequest.cs 132 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Crabtree/SmartHome/HDL/Common/HttpUtil/HttpUtil.cs 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Crabtree/SmartHome/HDL/Common/HttpUtil/NewAPI.cs 68 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Crabtree/SmartHome/HDL/Operation/ResponseEntity/API.cs 96 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Crabtree/SmartHome/UI/SimpleControl/MainPage.cs 84 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Crabtree/SmartHome/UI/SimpleControl/Phone/Register/Databackup.cs 942 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Crabtree/ON.Ios/AppDelegate.cs
@@ -278,7 +278,7 @@
        {
            if (closeTime == DateTime.MinValue) {
                closeTime = DateTime.Now;
            } else if (closeTime.AddSeconds (10) < DateTime.Now) {
            } else if (closeTime.AddSeconds (20) < DateTime.Now) {
                if (CommonPage.IsRemote) {
                    MqttCommon.DisConnectRemote ("closeTime", false);
                }
Crabtree/ON/Application.cs
@@ -332,7 +332,7 @@
                closeTime = DateTime.Now;
            } else if (closeTime.AddSeconds (20) < DateTime.Now) {
                if (CommonPage.IsRemote) {
                    SmartHome.MqttCommon.DisConnectRemoteMqttClient ("closeTime");
                    MqttCommon.DisConnectRemote ("closeTime", false);
                }
            }
            
Crabtree/SmartHome/HDL/Common/CommonUtlis.cs
@@ -1,6 +1,8 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text.RegularExpressions;
using Shared.SimpleControl;
namespace Shared
{
@@ -185,6 +187,371 @@
            alert.Show ();
        }
        #region ■ 通用Dialog_______________________
        /// <summary>
        /// 通用编辑Dialog
        /// </summary>
        /// <param name="nameStr"></param>
        /// <param name="titleStr"></param>
        public void ShowEditTextDialog (string nameStr, Action<string> saveAction, string titleStr = "")
        {
            Dialog dialog = new Dialog ();
            FrameLayout dialogBodyView = new FrameLayout () {
                Gravity = Gravity.Center,
                Width = Application.GetRealWidth (500),
                Height = Application.GetRealHeight (330),
                Radius = 5,
                BorderColor = SkinStyle.Current.Transparent,
                BorderWidth = 0,
                BackgroundColor = SkinStyle.Current.DialogColor,
            };
            dialog.AddChidren (dialogBodyView);
            Button btnTitle = new Button () {
                Height = Application.GetRealHeight (80),
                TextAlignment = TextAlignment.Center,
                Text = titleStr,
                TextColor = SkinStyle.Current.DialogTextColor,
                BackgroundColor = SkinStyle.Current.DialogTitle,
            };
            dialogBodyView.AddChidren (btnTitle);
            EditText etZoneName = new EditText () {
                X = Application.GetRealWidth (50),
                Y = Application.GetRealHeight (120),
                Width = Application.GetRealWidth (400),
                Height = Application.GetRealHeight (80),
                TextColor = SkinStyle.Current.TextColor,
                TextAlignment = TextAlignment.Center,
                Radius = 5,
                BorderColor = SkinStyle.Current.BorderColor,
                BorderWidth = 2,
                Text = nameStr,
            };
            dialogBodyView.AddChidren (etZoneName);
            FrameLayout BottomView = new FrameLayout () {
                Y = dialogBodyView.Height - Application.GetRealHeight (88),
                Height = Application.GetRealHeight (90),
                BackgroundColor = SkinStyle.Current.Black50Transparent,
            };
            dialogBodyView.AddChidren (BottomView);
            Button btnClose = new Button () {
                Width = Application.GetRealWidth (250),
                TextID = SimpleControl.R.MyInternationalizationString.Close,
                TextColor = SkinStyle.Current.DialogTextColor,
                BackgroundColor = SkinStyle.Current.DialogTitle,
            };
            BottomView.AddChidren (btnClose);
            btnClose.MouseUpEventHandler += (sdf, fds) => {
                dialog.Close ();
            };
            Button btnOption = new Button () {
                X = btnClose.Right + Application.GetRealWidth (2),
                Width = Application.GetRealWidth (250),
                TextID = SimpleControl.R.MyInternationalizationString.SAVE,
                TextColor = SkinStyle.Current.DialogTextColor,
                BackgroundColor = SkinStyle.Current.DialogTitle,
            };
            BottomView.AddChidren (btnOption);
            btnOption.MouseUpEventHandler += (sdf, fds) => {
                //修改名称
                var newStr = etZoneName.Text.Trim ();
                if (nameStr != newStr) {
                    saveAction?.Invoke (newStr);
                }
                dialog.Close ();
            };
            dialog.Show ();
        }
        #endregion
        #region ■ 共用上传备份操作_______________________
        /// <summary>
        /// 将当前本地数据上传到自动备份
        /// </summary>
        /// <param name="finishAction">上传结束事件</param>
        public void ShowUploadToAutomaticBackupDialog (Action finishAction)
        {
            Dialog dialog = new Dialog ();
            FrameLayout dialogBodyView = new FrameLayout () {
                Gravity = Gravity.Center,
                Width = Application.GetRealWidth (500),
                Height = Application.GetRealHeight (500),
                BackgroundColor = SkinStyle.Current.DialogColor,
                Radius = 5,
                BorderColor = SkinStyle.Current.Transparent,
                BorderWidth = 0,
            };
            dialog.AddChidren (dialogBodyView);
            Button btnTitle = new Button () {
                Height = Application.GetRealHeight (80),
                BackgroundColor = SkinStyle.Current.DialogTitle,
                TextAlignment = TextAlignment.Center,
                TextID = SimpleControl.R.MyInternationalizationString.Backup,
                TextColor = SkinStyle.Current.DialogTextColor
            };
            dialogBodyView.AddChidren (btnTitle);
            //Button btnGoDownTip = new Button () {
            //    Gravity = Gravity.CenterHorizontal,
            //    Y = Application.GetRealHeight (90 - 26),
            //    Width = Application.GetRealWidth (53),
            //    Height = Application.GetRealHeight (26),
            //    UnSelectedImagePath = "Room/godown.png",
            //};
            //dialogBodyView.AddChidren (btnGoDownTip);
            Button btnackupRemark = new Button () {
                Gravity = Gravity.CenterHorizontal,
                Y = Application.GetRealHeight (100),
                Width = Application.GetRealWidth (400),
                Height = Application.GetRealHeight (80),
                TextID = SimpleControl.R.MyInternationalizationString.Remark,
                TextAlignment = TextAlignment.CenterLeft,
                TextColor = SkinStyle.Current.TextColor,
            };
            dialogBodyView.AddChidren (btnackupRemark);
            EditText etBackupRemark = new EditText () {
                Gravity = Gravity.CenterHorizontal,
                Y = btnackupRemark.Bottom,
                Width = Application.GetRealWidth (400),
                Height = Application.GetRealHeight (80),
                TextAlignment = TextAlignment.Center,
                Radius = 5,
                BorderColor = SkinStyle.Current.BorderColor,
                BorderWidth = 1,
                TextColor = SkinStyle.Current.TextColor,
            };
            dialogBodyView.AddChidren (etBackupRemark);
            etBackupRemark.EditorEnterAction += (obj) => {
                Application.HideSoftInput ();
            };
            FrameLayout bottomView = new FrameLayout () {
                Y = Application.GetRealHeight (420),
                Height = Application.GetRealHeight (85),
                BackgroundColor = SkinStyle.Current.DialogTitle
            };
            dialogBodyView.AddChidren (bottomView);
            Button btnClose = new Button () {
                Width = Application.GetRealWidth (249),
                TextID = SimpleControl.R.MyInternationalizationString.Close,
                TextAlignment = TextAlignment.Center
            };
            bottomView.AddChidren (btnClose);
            btnClose.MouseUpEventHandler += (send2er, e2) => {
                dialog.Close ();
            };
            Button btnBottomLine = new Button () {
                X = btnClose.Right,
                Width = 1,
                BackgroundColor = SkinStyle.Current.Black50Transparent,
            };
            bottomView.AddChidren (btnBottomLine);
            Button btnSave = new Button () {
                X = btnBottomLine.Right,
                Width = Application.GetRealWidth (249),
                TextID = SimpleControl.R.MyInternationalizationString.SAVE,
                TextAlignment = TextAlignment.Center
            };
            bottomView.AddChidren (btnSave);
            btnSave.MouseUpEventHandler += (sender2, e2) => {
                if (etBackupRemark.Text.Trim () == "") {
                    new Alert (Language.StringByID (SimpleControl.R.MyInternationalizationString.Tip), Language.StringByID (SimpleControl.R.MyInternationalizationString.InputNewBakeUpFilesName),
                                   Language.StringByID (SimpleControl.R.MyInternationalizationString.Close)).Show ();
                    return;
                }
                if (MainPage.LoginUser == null) {
                    new Alert (Language.StringByID (SimpleControl.R.MyInternationalizationString.Tip), Language.StringByID (SimpleControl.R.MyInternationalizationString.PleaseLoginSystem),
                                  Language.StringByID (SimpleControl.R.MyInternationalizationString.Close)).Show ();
                    return;
                }
                userBakeupFile (etBackupRemark.Text.Trim (), finishAction);
                dialog.Close ();
            };
            dialog.Show ();
        }
        ///// <summary>
        ///// 交互备份
        ///// </summary>
        //int InteractiveBackup = 0;
        ///// <summary>
        ///// 自定义工程备份
        ///// </summary>
        //int CustomProjectBackup = 1;
        ///// <summary>
        ///// 用户自动备份
        ///// </summary>
        //int UserAutoBackup = 2;
        ///// <summary>
        ///// 用户自定义备份
        ///// </summary>
        //int UserCustomizedBackup = 3;
        /// <summary>
        /// 用户备份文件
        /// </summary>
        void userBakeupFile (string folderName, Action finishAction)
        {
            MainPage.Loading.Start ("Upload...");
            System.Threading.Tasks.Task.Run (() => {
                try {
                    var revertObj = HttpServerRequest.Current.CreateBackupFolder(folderName);
                    if (revertObj.Code == StateCode.SUCCESS) {
                        var mBackupFolderCreateRes = Newtonsoft.Json.JsonConvert.DeserializeObject<BackupFolderCreateRes> (revertObj.Data.ToString ());
                        //UpLoadBackupFileNEW (mBackupFolderCreateRes.id);
                        UpLoadBackupFileOne (mBackupFolderCreateRes.id);
                    } else {
                        IMessageCommon.Current.ShowErrorInfoAlter (revertObj.Code);
                    }
                } catch (Exception ex) {
                    Shared.Application.RunOnMainThread (() => {
                        new Alert (Language.StringByID (SimpleControl.R.MyInternationalizationString.Tip), Language.StringByID (SimpleControl.R.MyInternationalizationString.CheckInternet),
                                   Language.StringByID (SimpleControl.R.MyInternationalizationString.Close)).Show ();
                        Shared.Utlis.WriteLine (ex.Message);
                    });
                } finally {
                    Shared.Application.RunOnMainThread (() => {
                        MainPage.Loading.Hide ();
                        //结束事件
                        finishAction?.Invoke ();
                    });
                }
            });
        }
        //2020-01-11
        /// <summary>
        /// 删除某个备份
        /// </summary>
        /// <param name="folderID"></param>
        void DeleteFolderDataAfterUploadFailed (string folderID)
        {
            try {
                var revertObj = HttpServerRequest.Current.DeleteBackupFolder (folderID);
                if (revertObj.Code == StateCode.SUCCESS) {
                    //GetHomeDataBackupList ();
                } else {
                    //IMessageCommon.Current.ShowErrorInfoAlter (API.API_DELETE_Folder_Delete, revertObj.StateCode);
                }
            } catch { } finally {
                Application.RunOnMainThread (() => {
                    MainPage.Loading.Hide ();
                });
            }
        }
        /// <summary>
        /// 上传备份文件
        /// 多次上传多个文件
        /// </summary>
        /// <param name="mBackupClassId"></param>
        public void UpLoadBackupFileOne (string folderId)
        {
            var backuplist = IO.FileUtils.ReadFiles ();
            var mFileList = backuplist.FindAll ((obj) => obj != "null" && obj != UserConfig.configFile && obj != UserInfo.GlobalRegisterFile && obj != "AccountListDB" && obj != CommonConfig.ConfigFile && (!obj.Contains (".json")));
            if (mFileList.Count <= 0) return;
            int resultCount = mFileList.Count;
            int index = 0;
            foreach (var fileName in mFileList) {
                byte [] fileBytes = IO.FileUtils.ReadFile (fileName);
                var result = UploadDataBackupByOne (folderId, fileName, fileBytes);
                if (result) {
                    index++;
                    Application.RunOnMainThread (() => {
                        int pro = (int)(index * 1.0 / resultCount * 100);
                        MainPage.Loading.Text = pro.ToString () + "%";
                    });
                } else {
                    Console.WriteLine ("上传失败:" + fileName);
                }
            }
            Utlis.WriteLine ($"上传完成");
            if (index != resultCount) {
                //2020-01-11 备份失败
                DeleteFolderDataAfterUploadFailed (folderId);
                Shared.Application.RunOnMainThread (() => {
                    new Alert ("", Language.StringByID (SimpleControl.R.MyInternationalizationString.FailedToBackupFile), Language.StringByID (SimpleControl.R.MyInternationalizationString.Close)).Show ();
                    MainPage.Loading.Hide ();
                });
                return;
            }
            Application.RunOnMainThread (() => {
                //MainPage.Loading.Text = "100%";
                new Alert ("", Language.StringByID (SimpleControl.R.MyInternationalizationString.BackupFileIsSuccessful), Language.StringByID (SimpleControl.R.MyInternationalizationString.Close)).Show ();
            });
        }
        /// <summary>
        ///
        /// </summary>
        /// <param name="folderId"></param>
        /// <param name="fileName"></param>
        /// <param name="fileBytes"></param>
        /// <returns></returns>
        bool UploadDataBackupByOne (string folderId, string fileName, byte [] fileBytes)
        {
            try {
                var queryDic = new Dictionary<string, object> ();
                queryDic.Add ("folderId", folderId);
                queryDic.Add ("fileName", fileName);
                queryDic.Add ("homeId", UserConfig.Instance.CurrentRegion.Id);
                var revertObj = HttpUtil.RequestHttpsUpload (RestSharp.Method.POST, NewAPI.API_POST_File_Create, fileBytes, queryDic, null, UserConfig.Instance.CurrentRegion.regionUrl);
                if (revertObj.Code == StateCode.SUCCESS) {
                    return true;
                } else {
                    //提示错误
                    return false;
                }
            } catch {
                return false;
            }
        }
        #endregion
        //#region ■ 文件操作_______________________
        ///// <summary>
        ///// 删除本地文件
        ///// </summary>
        //public void ReadFilesAndDelete ()
        //{
        //    var fileNames = IO.FileUtils.ReadFiles ();
        //    foreach (var fileName in fileNames) {
        //        if (fileName == UserInfo.GlobalRegisterFile || fileName == UserConfig.configFile || fileName == MqttInfoConfig.ConfigFile || fileName == APIInfoConfig.ConfigFile) {
        //            continue;
        //        }
        //        IO.FileUtils.DeleteFile (fileName);
        //    }
        //}
        //#endregion
    }
}
Crabtree/SmartHome/HDL/Common/HttpUtil/HttpServerRequest.cs
@@ -31,7 +31,6 @@
        }
        #endregion
        #region ■ 通用请求接口_______________________
        /// <summary>
        /// 根椐用户账号获取注册区域 免登录 // 检测账号是否注册也用这个接口
@@ -67,7 +66,7 @@
        }
        #endregion
        #region 注册、登录部分
        #region * 注册、登录部分___________________________
        /// <summary>
        /// 通用 发送验证码方法
        /// </summary>
@@ -222,7 +221,7 @@
        #endregion
        #region 个人信息部分
        #region * 个人信息部分___________________________
        ///// <summary>
        ///// 获取用户信息
        ///// </summary>
@@ -237,7 +236,7 @@
        //        MainPage.LoginUser.userEmailInfo = info.memberEmail;
        //        MainPage.LoginUser.userMobileInfo = info.memberPhone;
        //        MainPage.LoginUser.userName = info.memberName;
        //        if (!string.IsNullOrEmpty(info.memberPhonePrefix))
        //        {
        //            MainPage.LoginUser.areaCode = info.memberPhonePrefix;
@@ -358,7 +357,7 @@
        #endregion
        #region 住宅部分
        #region * 住宅部分___________________________
        ///// <summary>
        ///// 获取住宅列表
        ///// </summary>
@@ -483,6 +482,7 @@
            return HttpUtil.RequestHttpsPostFroHome (NewAPI.API_POST_Home_Delete, requestJson);
        }
        #region 网关相关
        /// <summary>
        /// 绑定网关
        /// </summary>
@@ -535,6 +535,7 @@
                return "";
            }
        }
        /// <summary>
        /// 获取网关信息
        /// </summary>
@@ -558,9 +559,9 @@
            }
            return revertObj.Code;
        }
        #endregion
        #region 子账号相关
        /// <summary>
        /// 获取住宅下的成员账号
        /// </summary>
@@ -569,6 +570,21 @@
        {
            var requestJson = HttpUtil.GetSignRequestJson(new HomeIdObj() { homeId = UserConfig.Instance.CurrentRegion.Id });
            return HttpUtil.RequestHttpsPostFroHome(NewAPI.API_POST_Child_FindAll, requestJson);
        }
        /// <summary>
        /// 绑定子账号到住宅下
        /// </summary>
        /// <param name="subAccount"></param>
        /// <param name="nickName"></param>
        /// <returns></returns>
        public ResponsePackNew BindResidenceMemberAccount (string subAccount, string nickName)
        {
            //添加子账号
            var requestObj = new ChildAddObj () { homeId = UserConfig.Instance.CurrentRegion.Id, account = subAccount, nickName = nickName };
            var requestJson = HttpUtil.GetSignRequestJson (requestObj);
            return HttpUtil.RequestHttpsPostFroHome (NewAPI.API_POST_Child_Add, requestJson);
        }
        /// <summary>
@@ -603,6 +619,7 @@
            return HttpUtil.RequestHttpsPostFroHome(NewAPI.API_POST_Child_Update, requestJson);
        }
        /// <summary>
        /// 修改子账号创建场景权限
        /// </summary>
@@ -619,6 +636,7 @@
            });
            return HttpUtil.RequestHttpsPostFroHome(NewAPI.API_POST_Child_Update, requestJson);
        }
        #endregion
        #region 新数据分享
        /// <summary>
@@ -662,23 +680,92 @@
        }
        #endregion
        /// <summary>
        /// 绑定子账号到住宅下
        /// </summary>
        /// <param name="subAccount"></param>
        /// <param name="nickName"></param>
        /// <returns></returns>
        public ResponsePackNew BindResidenceMemberAccount(string subAccount, string nickName)
        {
            //添加子账号
            var requestObj = new ChildAddObj() { homeId = UserConfig.Instance.CurrentRegion.Id, account = subAccount, nickName = nickName };
            var requestJson = HttpUtil.GetSignRequestJson(requestObj);
            return HttpUtil.RequestHttpsPostFroHome(NewAPI.API_POST_Child_Add, requestJson);
        #endregion
        #region * 备份相关部分___________________________
        /// <summary>
        /// 创建备份文件夹
        /// </summary>
        /// <param name="folderName"></param>
        /// <returns></returns>
        public ResponsePackNew GetHomeDataBackupList ()
        {
            var requestObj = new HomeIdObj () {
                homeId = UserConfig.Instance.CurrentRegion.Id,
            };
            var requestJson = HttpUtil.GetSignRequestJson (requestObj);
            return HttpUtil.RequestHttpsPostFroHome (NewAPI.API_POST_Folder_FindAll, requestJson);
        }
        /// <summary>
        /// 创建备份文件夹
        /// </summary>
        /// <param name="folderName"></param>
        /// <returns></returns>
        public ResponsePackNew CreateBackupFolder (string folderName)
        {
            var requestObj = new BackupFolderCreateObj () {
                backupClassify = BackupClassify.USER_DEFINED_BACKUP.ToString (),
                backupDataType = BackupDataType.HDL_ON.ToString (),
                homeId = UserConfig.Instance.CurrentRegion.Id,
                folderName = folderName,
            };
            var requestJson = HttpUtil.GetSignRequestJson (requestObj);
            return HttpUtil.RequestHttpsPostFroHome (NewAPI.API_POST_Folder_Create, requestJson);
        }
        /// <summary>
        /// 修改备份文件夹名字
        /// </summary>
        /// <param name="newName"></param>
        /// <param name="mBackupFile"></param>
        /// <returns></returns>
        public ResponsePackNew UpdateBackupFolderName (string newName, BackupListNameInfoRes mBackupFile)
        {
            var requestObj = new UpdateBackupObj () {
                folderId = mBackupFile.id,
                homeId = mBackupFile.homeId,
                folderName = newName,
            };
            var requestJson = HttpUtil.GetSignRequestJson (requestObj);
            return HttpUtil.RequestHttpsPostFroHome (NewAPI.API_POST_Folder_Update, requestJson);
        }
        /// <summary>
        /// 删除备份文件夹
        /// </summary>
        /// <param name="folderId"></param>
        /// <returns></returns>
        public ResponsePackNew DeleteBackupFolder (string folderId)
        {
            var requestObj = new BackupFolderIdObj () {
                homeId = UserConfig.Instance.CurrentRegion.Id,
                folderId = folderId,
            };
            var requestJson = HttpUtil.GetSignRequestJson (requestObj);
            return HttpUtil.RequestHttpsPostFroHome (NewAPI.API_POST_Folder_Delete, requestJson);
        }
        /// <summary>
        /// 获取备份文件夹所有文件列表
        /// </summary>
        /// <param name="folderId"></param>
        /// <returns></returns>
        public ResponsePackNew GetBackupFolderAllFileList (string folderId)
        {
            var requestObj = new BackupFolderIdObj () {
                homeId = UserConfig.Instance.CurrentRegion.Id,
                folderId = folderId,
            };
            var requestJson = HttpUtil.GetSignRequestJson (requestObj);
            return HttpUtil.RequestHttpsPostFroHome (NewAPI.API_POST_File_FindAll, requestJson);
        }
        #endregion
        #region * Mqtt___________________________
        /// <summary>
        /// 获取MQTT远程连接信息接口
        /// </summary>
@@ -698,7 +785,7 @@
                }
                else
                {
                    Utlis.WriteLine("GetMqttRemoteInfo error");
                    Utlis.WriteLine("GetMqttRemoteInfo error Code:" + revertObj.Code);
                    return null;
                }
            }
@@ -707,9 +794,9 @@
                return null;
            }
        }
        #endregion
        #region 获取天气部分
        #region * 获取天气部分___________________________
        /// <summary>
        /// 获取指定经纬度的城市信息
        /// </summary>
@@ -765,7 +852,6 @@
        }
        #endregion
        //#region Kaede --设备功能——————————————————————————————————
        ///// <summary>
Crabtree/SmartHome/HDL/Common/HttpUtil/HttpUtil.cs
@@ -391,7 +391,7 @@
        /// <param name="replaceToken"></param>
        /// <param name="mTimeout"></param>
        /// <returns></returns>
        public static ResponsePackNew RequestHttpsUpload(Method method, string apiPath, object bodyParameterObject = null, Dictionary<string, object> queryDictionary = null, Dictionary<string, object> urlSegmentDictionary = null, string urlHead = "", string replaceToken = "", int mTimeout = 10)
        public static ResponsePackNew RequestHttpsUpload(Method method, string apiPath, object bodyParameterObject = null, Dictionary<string, object> queryDictionary = null, Dictionary<string, object> urlSegmentDictionary = null, string urlHead = "", string replaceToken = "", int mTimeout = 20)
        {
            #region HttpWebRequest
            try
@@ -408,7 +408,6 @@
                ////**************测试**************
                RestClient client = new RestClient(requestFullUrl);
                //client.Timeout = mTimeout * 1000;
                RestRequest request = new RestRequest(method);
                request.Timeout = mTimeout * 1000;
                //request.AddHeader ("content-type", "application/json");
Crabtree/SmartHome/HDL/Common/HttpUtil/NewAPI.cs
@@ -197,45 +197,45 @@
        #endregion
        #region ■ HomebackupCluster -- 住宅备份微服务___________________________
        ///// <summary>
        ///// 创建文件夹
        ///// </summary>
        //public const string API_POST_Folder_Create = "/home-wisdom/app/backup/folder/create";
        /// <summary>
        /// 创建文件夹
        /// </summary>
        public const string API_POST_Folder_Create = "/home-wisdom/app/backup/folder/create";
        /// <summary>
        /// 删除文件夹
        /// </summary>
        public const string API_POST_Folder_Delete = "/home-wisdom/app/backup/folder/delete";
        /// <summary>
        /// 查找所有文件夹
        /// </summary>
        public const string API_POST_Folder_FindAll = "/home-wisdom/app/backup/folder/findAll";
        /// <summary>
        /// 更新文件夹
        /// </summary>
        public const string API_POST_Folder_Update = "/home-wisdom/app/backup/folder/update";
        /// <summary>
        /// 上传文件
        /// </summary>
        public const string API_POST_File_Create = "/home-wisdom/app/backup/file/create";
        ///// <summary>
        ///// 删除文件夹
        ///// 删除文件
        ///// </summary>
        //public const string API_POST_Folder_Delete = "/home-wisdom/app/backup/folder/delete";
        //public const string API_DELETE_File_Delete = "/HomebackupCluster/V1/file/delete";
        ///// <summary>
        ///// 查找所有文件夹
        ///// </summary>
        //public const string API_POST_Folder_FindAll = "/home-wisdom/app/backup/folder/findAll";
        /// <summary>
        /// 下载备份文件
        /// </summary>
        public const string API_POST_File_Down = "/home-wisdom/app/backup/file/downOne";
        ///// <summary>
        ///// 更新文件夹
        ///// </summary>
        //public const string API_POST_Folder_Update = "/home-wisdom/app/backup/folder/update";
        ///// <summary>
        ///// 上传文件
        ///// </summary>
        //public const string API_POST_File_Create = "/home-wisdom/app/backup/file/create";
        /////// <summary>
        /////// 删除文件
        /////// </summary>
        ////public const string API_DELETE_File_Delete = "/HomebackupCluster/V1/file/delete";
        ///// <summary>
        ///// 下载备份文件
        ///// </summary>
        //public const string API_POST_File_Down = "/home-wisdom/app/backup/file/downOne";
        ///// <summary>
        ///// 查询一个文件夹所有文件名
        ///// </summary>
        //public const string API_POST_File_FindAll = "/home-wisdom/app/backup/file/findAll";
        /// <summary>
        /// 查询一个文件夹所有文件名
        /// </summary>
        public const string API_POST_File_FindAll = "/home-wisdom/app/backup/file/findAll";
        #endregion
Crabtree/SmartHome/HDL/Operation/ResponseEntity/API.cs
@@ -46,18 +46,18 @@
        ///// 忘记密码
        ///// </summary>
        //public static string YdForgetPassword = API_ZigbeeUsers + "YdForgetPassword";
        /// <summary>
        ///  绑定子账号到项目  need Authorization
        /// </summary>
        public static string BindSubAccount = API_ZigbeeUsers + "BindSubAccount";
        /// <summary>
        /// 解除子账号和住宅的绑定  need Authorization
        /// </summary>
        public static string DeletedSubAccount = API_ZigbeeUsers + "DeletedSubAccount";
        /// <summary>
        /// 获取项目(住宅)下面的子账号  need Authorization
        /// </summary>
        public static string GetSubAccountByDistributedMark = API_ZigbeeUsers + "GetSubAccountByDistributedMark";
        ///// <summary>
        /////  绑定子账号到项目  need Authorization
        ///// </summary>
        //public static string BindSubAccount = API_ZigbeeUsers + "BindSubAccount";
        ///// <summary>
        ///// 解除子账号和住宅的绑定  need Authorization
        ///// </summary>
        //public static string DeletedSubAccount = API_ZigbeeUsers + "DeletedSubAccount";
        ///// <summary>
        ///// 获取项目(住宅)下面的子账号  need Authorization
        ///// </summary>
        //public static string GetSubAccountByDistributedMark = API_ZigbeeUsers + "GetSubAccountByDistributedMark";
        ///// <summary>
@@ -70,36 +70,36 @@
        //***************************APP 部分********************************
        public static string API_APP = "/App/";
        /// <summary>
        ///  1.21 添加项目(住宅)[App(网关)手动备份]备注文件夹
        /// </summary>
        public static string AddHomeAppGatewayName = API_APP + "AddHomeAppGatewayName";
        /// <summary>
        ///  1.22 上传[项目(住宅(App(网关)手动备份]子文件
        /// </summary>
        public static string UploadHomeAppGatewaySubFiles = API_APP + "UploadHomeAppGatewaySubFiles";
        public static string UploadHomeAppGatewaySingleSubFile = API_APP + "UploadHomeAppGatewaySingleSubFile";
        ///// <summary>
        /////  1.23 删除App备份[手动备份住宅、手动备份网关、自动备份住宅、公共备份]的某些文件
        /////  1.21 添加项目(住宅)[App(网关)手动备份]备注文件夹
        ///// </summary>
        //public static string DeleteAppBackupFile = API_APP + "DeleteAppBackupFile";
        /// <summary>
        ///  1.24 获取住宅备份数据_分页
        /// </summary>
        public static string GetHomeDataBackupPagger = API_APP + "GetHomeDataBackupPagger";
        /// <summary>
        ///  1.25 获取备份文件不带数据_分页
        /// </summary>
        public static string GetHomeDataBackupUploadListPagger = API_APP + "GetHomeDataBackupUploadListPagger";
        /// <summary>
        ///  1.26 下载某一个备份数据文件
        /// </summary>
        public static string DownloadSomeDataBackup = API_APP + "DownloadSomeDataBackup";
        /// <summary>
        ///  1.27 删除项目(住宅)各种备份文件夹(文件夹下所有文件也会删除)
        /// </summary>
        public static string DelHomeAppGatewayName = API_APP + "DelHomeAppGatewayName";
        //public static string AddHomeAppGatewayName = API_APP + "AddHomeAppGatewayName";
        ///// <summary>
        /////  1.22 上传[项目(住宅(App(网关)手动备份]子文件
        ///// </summary>
        //public static string UploadHomeAppGatewaySubFiles = API_APP + "UploadHomeAppGatewaySubFiles";
        //public static string UploadHomeAppGatewaySingleSubFile = API_APP + "UploadHomeAppGatewaySingleSubFile";
        /////// <summary>
        ///////  1.23 删除App备份[手动备份住宅、手动备份网关、自动备份住宅、公共备份]的某些文件
        /////// </summary>
        ////public static string DeleteAppBackupFile = API_APP + "DeleteAppBackupFile";
        ///// <summary>
        /////  1.24 获取住宅备份数据_分页
        ///// </summary>
        //public static string GetHomeDataBackupPagger = API_APP + "GetHomeDataBackupPagger";
        ///// <summary>
        /////  1.25 获取备份文件不带数据_分页
        ///// </summary>
        //public static string GetHomeDataBackupUploadListPagger = API_APP + "GetHomeDataBackupUploadListPagger";
        ///// <summary>
        /////  1.26 下载某一个备份数据文件
        ///// </summary>
        //public static string DownloadSomeDataBackup = API_APP + "DownloadSomeDataBackup";
        ///// <summary>
        /////  1.27 删除项目(住宅)各种备份文件夹(文件夹下所有文件也会删除)
        ///// </summary>
        //public static string DelHomeAppGatewayName = API_APP + "DelHomeAppGatewayName";
        ///// <summary>
        /////  1.28 更新项目(住宅)[App(网关)手动备份]备注名
        ///// </summary>
@@ -126,20 +126,20 @@
        /////  1.63 获得某个帐号所有已绑定的网关分页
        ///// </summary>
        //public static string GetAllBindGatewarysPagger = API_APP + "GetAllBindGatewarysPagger";
        /// <summary>
        ///  1.64 获取某个住宅的网关分页
        /// </summary>
        public static string GetSingleHomeGatewayPagger = API_APP + "GetSingleHomeGatewayPagger";
        ///// <summary>
        /////  1.64 获取某个住宅的网关分页
        ///// </summary>
        //public static string GetSingleHomeGatewayPagger = API_APP + "GetSingleHomeGatewayPagger";
        ///// <summary>
        /////  1.65 UpdateMac 更新Mac(印度)
        ///// </summary>
        //public static string UpdateMac = API_APP + "UpdateMac";
        /// <summary>
        ///  1.66 BindMac 更新绑定Mac(印度)
        /// </summary>
        public static string BindMac = API_APP + "BindMac";
        ///// <summary>
        /////  1.66 BindMac 更新绑定Mac(印度)
        ///// </summary>
        //public static string BindMac = API_APP + "BindMac";
        
Crabtree/SmartHome/UI/SimpleControl/MainPage.cs
@@ -254,52 +254,52 @@
        //}
        /// <summary>
        /// 请求服务器方法
        /// </summary>
        /// <returns>The https.</returns>
        /// <param name="methodType">请求方法.</param>
        /// <param name="dataStringJson">请求的参数.</param>
        /// <param name="needHeaders">是否需要包头.</param>
        public static byte [] RequestHttpsReturnByte (string methodType, string dataStringJson, bool needHeaders = false, string urlHead = "")
        {
            ResponsePack revertObj = null;
            try {
        ///// <summary>
        ///// 请求服务器方法
        ///// </summary>
        ///// <returns>The https.</returns>
        ///// <param name="methodType">请求方法.</param>
        ///// <param name="dataStringJson">请求的参数.</param>
        ///// <param name="needHeaders">是否需要包头.</param>
        //public static byte [] RequestHttpsReturnByte (string methodType, string dataStringJson, bool needHeaders = false, string urlHead = "")
        //{
        //    ResponsePack revertObj = null;
        //    try {
                ServicePointManager.ServerCertificateValidationCallback += (sender, cert, chain, error) => {
                    return true;
                };
        //        ServicePointManager.ServerCertificateValidationCallback += (sender, cert, chain, error) => {
        //            return true;
        //        };
                #region
                var webClient = new WebClient ();
                if (urlHead == "") {
                    urlHead = RequestHttpsHost;
                }
                //else {
                //    webClient.Headers.Add ("CONTENT-TYPE", "application/json");
                //}
                webClient.Headers.Add ("CONTENT-TYPE", "application/json");
                string url = urlHead + methodType;
                if (needHeaders && LoginUser != null) {/* 如果不需要验证Token可以不用传入 */
                    webClient.Headers.Add ("Authorization", LoginUser.LoginTokenString);
                }
                byte [] bytes = null;
                try {
                    bytes = webClient.UploadData (url, Encoding.UTF8.GetBytes (dataStringJson));
                } catch (System.Net.WebException webEx) {
                    return bytes;
                }
        //        #region
        //        var webClient = new WebClient ();
        //        if (urlHead == "") {
        //            urlHead = RequestHttpsHost;
        //        }
        //        //else {
        //        //    webClient.Headers.Add ("CONTENT-TYPE", "application/json");
        //        //}
        //        webClient.Headers.Add ("CONTENT-TYPE", "application/json");
        //        string url = urlHead + methodType;
        //        if (needHeaders && LoginUser != null) {/* 如果不需要验证Token可以不用传入 */
        //            webClient.Headers.Add ("Authorization", LoginUser.LoginTokenString);
        //        }
        //        byte [] bytes = null;
        //        try {
        //            bytes = webClient.UploadData (url, Encoding.UTF8.GetBytes (dataStringJson));
        //        } catch (System.Net.WebException webEx) {
        //            return bytes;
        //        }
             
            
                return bytes;
                #endregion
            } catch (Exception ex) {
                Utlis.WriteLine (ex.Message);
                return null;
            } finally {
                //requesTime = requesTime.AddDays(1);
            }
        }
        //        return bytes;
        //        #endregion
        //    } catch (Exception ex) {
        //        Utlis.WriteLine (ex.Message);
        //        return null;
        //    } finally {
        //        //requesTime = requesTime.AddDays(1);
        //    }
        //}
        /// <summary>
Crabtree/SmartHome/UI/SimpleControl/Phone/Register/Databackup.cs
@@ -17,6 +17,9 @@
            BackgroundColor = SkinStyle.Current.MainColor;
        }
        /// <summary>
        /// 加载备份文件列表页面
        /// </summary>
        public void DatabackupShow ()
        {
            this.RemoveAll ();
@@ -171,102 +174,11 @@
            topView.AddChidren (ItemButton);
            ItemButton.MouseUpEventHandler += (sender, e) => {
                Dialog dialog = new Dialog ();
                FrameLayout dialogBodyView = new FrameLayout () {
                    Gravity = Gravity.Center,
                    Width = Application.GetRealWidth (500),
                    Height = Application.GetRealHeight (500),
                    BackgroundColor = SkinStyle.Current.DialogColor,
                    Radius = 5,
                    BorderColor = SkinStyle.Current.Transparent,
                    BorderWidth = 0,
                Action finishAction = () => {
                    GetHomeDataBackupList ();
                };
                dialog.AddChidren (dialogBodyView);
                Button btnTitle = new Button () {
                    Height = Application.GetRealHeight (80),
                    BackgroundColor = SkinStyle.Current.DialogTitle,
                    TextAlignment = TextAlignment.Center,
                    TextID = R.MyInternationalizationString.Backup,
                    TextColor = SkinStyle.Current.DialogTextColor
                };
                dialogBodyView.AddChidren (btnTitle);
                Button btnackupRemark = new Button () {
                    Gravity = Gravity.CenterHorizontal,
                    Y = Application.GetRealHeight (100),
                    Width = Application.GetRealWidth (400),
                    Height = Application.GetRealHeight (80),
                    TextID = R.MyInternationalizationString.Remark,
                    TextAlignment = TextAlignment.CenterLeft,
                    TextColor = SkinStyle.Current.TextColor,
                };
                dialogBodyView.AddChidren (btnackupRemark);
                EditText etBackupRemark = new EditText () {
                    Gravity = Gravity.CenterHorizontal,
                    Y = btnackupRemark.Bottom,
                    Width = Application.GetRealWidth (400),
                    Height = Application.GetRealHeight (80),
                    TextAlignment = TextAlignment.Center,
                    Radius = 5,
                    BorderColor = SkinStyle.Current.BorderColor,
                    BorderWidth = 1,
                    TextColor = SkinStyle.Current.TextColor,
                };
                dialogBodyView.AddChidren (etBackupRemark);
                etBackupRemark.EditorEnterAction += (obj) => {
                    Application.HideSoftInput ();
                };
                FrameLayout bottomView = new FrameLayout () {
                    Y = Application.GetRealHeight (420),
                    Height = Application.GetRealHeight (85),
                    BackgroundColor = SkinStyle.Current.DialogTitle
                };
                dialogBodyView.AddChidren (bottomView);
                Button btnClose = new Button () {
                    Width = Application.GetRealWidth (249),
                    TextID = R.MyInternationalizationString.Close,
                    TextAlignment = TextAlignment.Center
                };
                bottomView.AddChidren (btnClose);
                btnClose.MouseUpEventHandler += (send2er, e2) => {
                    dialog.Close ();
                };
                Button btnBottomLine = new Button () {
                    X = btnClose.Right,
                    Width = 1,
                    BackgroundColor = SkinStyle.Current.Black50Transparent,
                };
                bottomView.AddChidren (btnBottomLine);
                Button btnSave = new Button () {
                    X = btnBottomLine.Right,
                    Width = Application.GetRealWidth (249),
                    TextID = R.MyInternationalizationString.SAVE,
                    TextAlignment = TextAlignment.Center
                };
                bottomView.AddChidren (btnSave);
                btnSave.MouseUpEventHandler += (sender2, e2) => {
                    if (etBackupRemark.Text.Trim () == "") {
                        new Alert ("", Language.StringByID (R.MyInternationalizationString.InputNewBakeUpFilesName),
                                       Language.StringByID (R.MyInternationalizationString.Close)).Show ();
                        return;
                    }
                    if (MainPage.LoginUser == null) {
                        new Alert ("", Language.StringByID (R.MyInternationalizationString.PleaseLoginSystem),
                                      Language.StringByID (R.MyInternationalizationString.Close)).Show ();
                        return;
                    }
                    userBakeupFile (etBackupRemark.Text.Trim ());
                    dialog.Close ();
                };
                dialog.Show ();
                //弹窗提示上传备份Dialog
                CommonUtlis.Current.ShowUploadToAutomaticBackupDialog (finishAction);
            };
            var back = new Button () {
@@ -293,66 +205,38 @@
            VerticalScrolViewMiddle.RemoveAll ();
            FrameLayoutView.AddChidren (VerticalScrolViewMiddle);
            GetHomeDataBackupList ();
        }
        /// <summary>
        /// 获取住宅备份数据列表
        /// </summary>
        void GetHomeDataBackupList ()
        {
            System.Threading.Tasks.Task.Run (() => {
                try {
                    Application.RunOnMainThread (() => {
                        MainPage.Loading.Start ("Please wait...");
                        VerticalScrolViewMiddle.RemoveAll ();
                        MainPage.Loading.Start (Language.StringByID (R.MyInternationalizationString.load));
                    });
                    var requestObj = new GetHomeDataBackupPaggerObj () {
                        HomeId = UserConfig.Instance.CurrentRegion.Id,
                        LoginAccessToken = MainPage.LoginUser.LoginTokenString
                    };
                    string urlHead = MainPage.RequestHttpsHost;
                    if (requestObj.IsOtherAccountCtrl) {
                        urlHead = UserConfig.Instance.MasterAccountRequestBaseUrl;
                        requestObj.LoginAccessToken = UserConfig.Instance.MasterAccountToken;
                    }
                    //GetUserFolderObj requestObj = new GetUserFolderObj () { LevelID = UserConfig.Instance.CurrentRegion.Id };
                    var requestJson = Newtonsoft.Json.JsonConvert.SerializeObject (requestObj);
                    var revertObj = MainPage.RequestHttps (API.GetHomeDataBackupPagger, requestJson, urlHead);
                    if (revertObj.StateCode.ToUpper () == StateCode.SUCCESS) {
                        var data = Newtonsoft.Json.JsonConvert.DeserializeObject<GetBackupListResult> (revertObj.ResponseData.ToString ());
                        //var list = new List<BackupListNameInfo> ();
                        //foreach (var data2 in data.PageData) {
                        //    if (ZigbeeUniqueId != null && data2.GatewayUniqueId != ZigbeeUniqueId) {
                        //        continue;
                        //    }
                        //    if (getLogBackup == false && data2.BackupName == LogBackupName) {
                        //        //不获取Log备份
                        //        continue;
                        //    }
                        //    list.Add (data2);
                        //}
                        //var responseDataObj = Newtonsoft.Json.JsonConvert.DeserializeObject<List<FolderRes>> (revertObj.ResponseData.ToString ());
                    var revertObj = HttpServerRequest.Current.GetHomeDataBackupList ();
                    if (revertObj.Code == StateCode.SUCCESS) {
                        var data = Newtonsoft.Json.JsonConvert.DeserializeObject<List<BackupListNameInfoRes>> (revertObj.Data.ToString ());
                        if (data == null) return;
                        Application.RunOnMainThread (() => {
                            foreach (var folder in data.PageData) {
                                addRow (folder.BackupName, folder.Id);
                            foreach (var folder in data) {
                                AddRowView (folder);
                            }
                        });
                    } else {
                        //2020-01-11 刷新一次MasterToken
                        if (requestObj.IsOtherAccountCtrl) {
                            //if (revertObj.StateCode == "ParameterOrEmpty" || revertObj.StateCode == "NoLogin" || revertObj.StateCode == "HomeIdAndTokenNoConsistent") {
                            if (revertObj.StateCode != ErrorCode.NetworkError) {
                                UserConfig.Instance.CheckIfNeedGetMasterAccountToken ();
                            }
                        }
                        MainPage.ShowAlertOnMainThread ("Failed to get backup data list!");
                        //提示错误
                        IMessageCommon.Current.ShowErrorInfoAlter (revertObj.Code);
                    }
                    //var groupNames = service_backup.GetUserGroup (MainPage.LoginUser.MasterID, 0);
                    //Application.RunOnMainThread (() => {
                    //    foreach (UserBackup groupName in groupNames) {
                    //        addRow (groupName.UserGroup);
                    //    }
                    //});
                } catch {
                    Application.RunOnMainThread (() => {
                        new Alert ("", Language.StringByID (R.MyInternationalizationString.CheckInternet), Language.StringByID (R.MyInternationalizationString.Close)).Show ();
                        new Alert (Language.StringByID (R.MyInternationalizationString.Tip), Language.StringByID (R.MyInternationalizationString.CheckInternet), Language.StringByID (R.MyInternationalizationString.Close)).Show ();
                    });
                } finally {
                    Application.RunOnMainThread (() => {
@@ -362,7 +246,12 @@
            });
        }
        void addRow (string groupName, string folderID)
        /// <summary>
        /// 加载view
        /// </summary>
        /// <param name="groupName"></param>
        /// <param name="folderID"></param>
        void AddRowView (BackupListNameInfoRes mBackupFile)
        {
            var rowView = new RowLayout () {
                Height = Application.GetRealHeight (110),
@@ -381,27 +270,23 @@
                BackgroundColor = SkinStyle.Current.DelColor
            };
            btnDelFile.MouseUpEventHandler += (sender, e) => {
                Alert alert = new Alert ("", Language.StringByID (R.MyInternationalizationString.AreYouSureToDeleteFile), Language.StringByID (R.MyInternationalizationString.Cancel), Language.StringByID (R.MyInternationalizationString.Confrim));
                Alert alert = new Alert (Language.StringByID (R.MyInternationalizationString.Tip), Language.StringByID (R.MyInternationalizationString.AreYouSureToDeleteFile), Language.StringByID (R.MyInternationalizationString.Cancel), Language.StringByID (R.MyInternationalizationString.Confrim));
                alert.ResultEventHandler += (sender2, e2) => {
                    if (e2) {
                        DeleteFolderData (folderID);
                        DeleteFolderData (mBackupFile.id);
                    }
                };
                alert.Show ();
            };
            //if (MainPage.LoginUser.AccountType != 1) {
            //    rowView.AddRightView (btnDelFile);
            //}
            //2020-07-01 当前住宅属于自己的 允许删除备份
            if (!MainPage.IsAdministrator) {
            //分享住宅隐藏删除备份按钮
            if (UserConfig.Instance.CurrentRegion.IsOthreShare == false) {
                rowView.AddRightView (btnDelFile);
            }
            var btnPoint = new Button () {
                Width = Application.GetRealWidth (10),
                Height = Application.GetRealWidth (10),
                Height = Application.GetRealHeight (10),
                X = Application.GetRealWidth (25),
                Gravity = Gravity.CenterVertical,
                UnSelectedImagePath = "Item/Point.png",
@@ -412,24 +297,21 @@
            var btnName = new Button () {
                Width = Application.GetRealWidth (342),
                Height = LayoutParams.MatchParent,
                Text = groupName.Trim (),
                Text = mBackupFile.folderName.Trim (),
                TextAlignment = TextAlignment.CenterLeft,
                X = Application.GetRealWidth (50),
                TextColor = SkinStyle.Current.TextColor1,
            };
            rowView.AddChidren (btnName);
            btnName.MouseLongEventHandler += (sender, e) => {
                Alert alert = new Alert ("", Language.StringByID (R.MyInternationalizationString.AreYouSureToDeleteFile), Language.StringByID (R.MyInternationalizationString.Cancel), Language.StringByID (R.MyInternationalizationString.Confrim));
                alert.ResultEventHandler += (sender2, e2) => {
                    if (e2) {
                        DeleteFolderData (folderID);
                    }
                };
                alert.Show ();
            //保存事件
            Action<string> renameAction = (newName) => {
                RenameFileName (newName, mBackupFile, btnName);
            };
            btnName.MouseUpEventHandler += (sender, e) => {
                CommonUtlis.Current.ShowEditTextDialog (mBackupFile.folderName, renameAction, Language.StringByID (R.MyInternationalizationString.rename));
            };
            var backupIcon = new Button () {
                Width = Application.GetRealWidth (72),
@@ -443,7 +325,7 @@
                Height = Application.GetMinRealAverage (57),
                X = backupIcon.Right + Application.GetRealWidth (20),
                UnSelectedImagePath = "Register/Backup_ restores.png",
                SelectedImagePath = "Register/Backup_ restores_on.png",
                SelectedImagePath = "Register/Backup_ restores.png",
                Gravity = Gravity.CenterVertical,
            };
            rowView.AddChidren (Backup_restores);
@@ -452,39 +334,61 @@
            };
            Backup_restores.MouseUpEventHandler += (sender, e) => {
                Backup_restores.IsSelected = false;
                UserBakeupFileDetailedInformation (folderID);
                UserBakeupFileDetailedInformation (mBackupFile.id);
            };
        }
        /// <summary>
        /// 请求修改备注
        /// </summary>
        /// <param name="newName"></param>
        /// <param name="mAlexa"></param>
        /// <param name="btnName"></param>
        void RenameFileName (string newName, BackupListNameInfoRes mBackupFile, Button btnName)
        {
            MainPage.Loading.Start (Language.StringByID (R.MyInternationalizationString.load));
            System.Threading.Tasks.Task.Run (() => {
                try {
                    var revertObj = HttpServerRequest.Current.UpdateBackupFolderName (newName, mBackupFile);
                    if (revertObj.Code == StateCode.SUCCESS) {
                        //AmendTheSuccess 修改成功
                        Application.RunOnMainThread (() => {
                            mBackupFile.folderName = newName;
                            btnName.Text = newName;
                            Utlis.ShowAlertOnMainThread (Language.StringByID (R.MyInternationalizationString.AmendTheSuccess));
                        });
                    } else {
                        //提示错误
                        IMessageCommon.Current.ShowErrorInfoAlter (revertObj.Code);
                    }
                } catch {
                } finally {
                    Application.RunOnMainThread (() => {
                        MainPage.Loading.Hide ();
                    });
                }
            });
        }
        /// <summary>
        /// 删除某个备份
        /// </summary>
        /// <param name="folderID"></param>
        void DeleteFolderData (string folderID)
        void DeleteFolderData (string folderId)
        {
            MainPage.Loading.Start ("Please wait...");
            MainPage.Loading.Start (Language.StringByID (R.MyInternationalizationString.load));
            System.Threading.Tasks.Task.Run (() => {
                try {
                    var requestObj = new DelHomeAppGatewayNameObj () {
                        BackupClassId = folderID,
                        HomeId = UserConfig.Instance.CurrentRegion.Id,
                        LoginAccessToken = MainPage.LoginUser.LoginTokenString
                    };
                    string urlHead = MainPage.RequestHttpsHost;
                    if (requestObj.IsOtherAccountCtrl) {
                        urlHead = UserConfig.Instance.MasterAccountRequestBaseUrl;
                        requestObj.LoginAccessToken = UserConfig.Instance.MasterAccountToken;
                    }
                    //DeleteFolderDataObj requestObj = new DeleteFolderDataObj () { Id = folderID };
                    var requestJson = Newtonsoft.Json.JsonConvert.SerializeObject (requestObj);
                    var revertObj = MainPage.RequestHttps (API.DelHomeAppGatewayName, requestJson, urlHead);
                    if (revertObj.StateCode.ToUpper () == StateCode.SUCCESS) {
                        Application.RunOnMainThread (() => {
                            DatabackupShow ();
                        });
                    var revertObj = HttpServerRequest.Current.DeleteBackupFolder (folderId);
                    if (revertObj.Code == StateCode.SUCCESS) {
                        GetHomeDataBackupList ();
                    } else {
                        ShowDelErrorInfo (revertObj.StateCode);
                        IMessageCommon.Current.ShowErrorInfoAlter (revertObj.Code);
                    }
                } catch { } finally {
                    Application.RunOnMainThread (() => {
@@ -495,383 +399,37 @@
        }
        //2020-01-11
        /// <summary>
        /// 删除某个备份
        /// </summary>
        /// <param name="folderID"></param>
        void DeleteFolderDataAfterUploadFailed (string folderID)
        {
            Application.RunOnMainThread (() => {
                MainPage.Loading.Start ("Please wait...");
            });
            try {
                var requestObj = new DelHomeAppGatewayNameObj () {
                    BackupClassId = folderID,
                    HomeId = UserConfig.Instance.CurrentRegion.Id,
                    LoginAccessToken = MainPage.LoginUser.LoginTokenString
                };
                string urlHead = MainPage.RequestHttpsHost;
                if (requestObj.IsOtherAccountCtrl) {
                    urlHead = UserConfig.Instance.MasterAccountRequestBaseUrl;
                    requestObj.LoginAccessToken = UserConfig.Instance.MasterAccountToken;
                }
                //DeleteFolderDataObj requestObj = new DeleteFolderDataObj () { Id = folderID };
                var requestJson = Newtonsoft.Json.JsonConvert.SerializeObject (requestObj);
                var revertObj = MainPage.RequestHttps (API.DelHomeAppGatewayName, requestJson, urlHead);
                if (revertObj.StateCode.ToUpper () == StateCode.SUCCESS) {
                    //删除成功
                } else {
                    //删除失败
                }
            } catch { } finally {
                Application.RunOnMainThread (() => {
                    MainPage.Loading.Hide ();
                });
            }
        }
        /// <summary>
        /// (2)ParameterOrEmpty,则响应字段中[ErrorInfo]为错误信息,ResponseData则为null
        //3)NoLogin,则响应字段中 [ErrorInfo] 为错误信息为 [无效登录Token!]
        //(5)NoRecord,则响应字段中 [ErrorInfo] 为错误信息为 [确保您所提交 [项目 (住宅)Id不存在!]
        //(6)BackupClassIdNoIsYou, 则响应字段中 [ErrorInfo]为错误信息为 [您所备注名主键 = XXXX并不属于您当前住宅:XXXX]
        //(7)NoPermission, 则响应字段中 [ErrorInfo]为错误信息为 [您并不具有此分享者此住宅的权限!]
        //(8)InsufficientAuthority, 则响应字段中 [ErrorInfo]为错误信息为 [您并不具有此分享者此住宅的完全控制权限!]
        //(9)HomeIdAndTokenNoConsistent, 则响应字段中 [ErrorInfo]为错误信息为 [您当前Token与你当前控制的HomeId不一致!]
        //(10)DeliveryBackNoUpdateDel, 则响应字段中 [ErrorInfo]为错误信息为 [此前提交文件夹Id是属于交付备份, 不能进行更新删除!]
        /// </summary>
        /// <param name="stateCodeStr"></param>
        void ShowDelErrorInfo (string stateCodeStr)
        {
            string mes = "";
            if (stateCodeStr == "HomeIdAndTokenNoConsistent") {
                //Token 验证失败
                mes = ErrorCode.HomeIdAndTokenNoConsistent;
            } else if (stateCodeStr == "DeliveryBackNoUpdateDel") {
                //交付备份, 不能删除!
                mes = ErrorCode.DeliveryBackNoUpdateDel;
            } else if (stateCodeStr == ErrorCode.NetworkError) {
                mes = ErrorCode.NetworkError;
            } else {
                mes = ErrorCode.OperationFailed + ErrorCode.Reason + stateCodeStr;
            }
            if (!string.IsNullOrEmpty (mes)) {
                Application.RunOnMainThread (() => {
                    new Alert ("", mes, Language.StringByID (R.MyInternationalizationString.Close)).Show ();
                });
            }
        }
        /// <summary>
        /// 用户备份文件
        /// </summary>
        void userBakeupFile (string groupName)
        {
            //确定要备份该文件的数据
            //Alert alert = new Alert ("", Language.StringByID (R.MyInternationalizationString.SureToBackupYourthisFile), Language.StringByID (R.MyInternationalizationString.Cancel), Language.StringByID (R.MyInternationalizationString.Confrim));
            //alert.ResultEventHandler += (object sender2, bool e2) => {
            //if (e2) {
            MainPage.Loading.Start ("Upload...");
            System.Threading.Tasks.Task.Run (() => {
                try {
                    //if (string.IsNullOrEmpty (UserConfig.Instance.GatewayMAC)) return;
                    //2020-01-11 没绑定MAC不允许上传备份
                    if (!UserConfig.Instance.CheckHomeGatewaysNotEmpty()) {
                        MainPage.ShowAlertOnMainThread (ErrorCode.BindGatewayFirst);
                        return;
                    }
                    var requestObj = new AddHomeAppGatewayNameObj () {
                        HomeId = UserConfig.Instance.CurrentRegion.Id,
                        BackupName = groupName,
                        LoginAccessToken = MainPage.LoginUser.LoginTokenString,
                        GatewayUniqueId = UserConfig.Instance.GatewayMAC
                    };
                    string urlHead = MainPage.RequestHttpsHost;
                    if (requestObj.IsOtherAccountCtrl) {
                        urlHead = UserConfig.Instance.MasterAccountRequestBaseUrl;
                        requestObj.LoginAccessToken = UserConfig.Instance.MasterAccountToken;
                    }
                    //AddFolderObj requestObj = new AddFolderObj () { LevelID = UserConfig.Instance.CurrentRegion.Id ,Name = groupName };
                    var requestJson = Newtonsoft.Json.JsonConvert.SerializeObject (requestObj);
                    var revertObj = MainPage.RequestHttps (API.AddHomeAppGatewayName, requestJson, urlHead);
                    if (revertObj.StateCode.ToUpper () == StateCode.SUCCESS) {
                        var DATA = Newtonsoft.Json.JsonConvert.DeserializeObject<AddBackupNameResult> (revertObj.ResponseData.ToString ());
                        var addFolderID = DATA.BackupClassId;
                        //UpLoadBackupFileToDB (addFolderID);
                        UpLoadBackupFileToDBNew (addFolderID);
                    } else {
                        ShowAddHomeAppGatewayNameErrorInfo (revertObj.StateCode);
                    }
                } catch (Exception ex) {
                    Shared.Application.RunOnMainThread (() => {
                        new Alert ("", Language.StringByID (R.MyInternationalizationString.CheckInternet),
                                   Language.StringByID (R.MyInternationalizationString.Close)).Show ();
                        Utlis.WriteLine (ex.Message);
                    });
                } finally {
                    Shared.Application.RunOnMainThread (() => {
                        MainPage.Loading.Hide ();
                        DatabackupShow ();
                    });
                }
            });
            //    }
            //};
            //alert.Show ();
        }
        /// <summary>
        ///(1)Success 则[调用此接口操作成功],ResponseData则为null
        //(2)ParameterOrEmpty,则响应字段中 [ErrorInfo] 为错误信息, ResponseData则为null
        //(3)NoLogin,则响应字段中 [ErrorInfo] 为错误信息为 [无效登录Token!]
        //(4)NoRecord,则响应字段中 [ErrorInfo] 为错误信息为 [确保您所提交 [项目 (住宅)Id不存在!]
        //(5)Exist, 则响应字段中 [ErrorInfo]为错误信息为 [您在住宅: XXX, 当前备份名: XXXX已存在, 请换个备份再提交!]
        //(6)NoBind, 则响应字段中 [ErrorInfo]为错误信息为 [网关的唯一Id = XXX,与住宅: XXXX并不存在绑定关系!]
        //(7)NoPermission, 则响应字段中 [ErrorInfo]为错误信息为 [您并不具有此分享者此住宅的权限!]
        //(8)InsufficientAuthority, 则响应字段中 [ErrorInfo]为错误信息为 [您并不具有此分享者此住宅的完全控制权限!]
        //(9)HomeIdAndTokenNoConsistent, 则响应字段中 [ErrorInfo]为错误信息为 [您当前Token与你当前控制的HomeId不一致!]
        /// </summary>
        /// <param name="stateCodeStr"></param>
        void ShowAddHomeAppGatewayNameErrorInfo (string stateCodeStr)
        {
            string mes = "";
            if (stateCodeStr == "Exist") {
                //备份名已存在
                mes = ErrorCode.NameExist;
            } else if (stateCodeStr == "HomeIdAndTokenNoConsistent") {
                //Token 验证失败
                mes = ErrorCode.HomeIdAndTokenNoConsistent;
            } else if (stateCodeStr == ErrorCode.NetworkError) {
                mes = ErrorCode.NetworkError;
            } else {
                mes = ErrorCode.OperationFailed + ErrorCode.Reason + stateCodeStr;
            }
            if (!string.IsNullOrEmpty (mes)) {
                Application.RunOnMainThread (() => {
                    new Alert ("", mes, Language.StringByID (R.MyInternationalizationString.Close)).Show ();
                });
            }
        }
        ///// <summary>
        ///// 上传备份文件
        ///// </summary>
        ///// <param name="mBackupClassId"></param>
        //void UpLoadBackupFileToDB (string mBackupClassId)
        //{
        //    var backuplist = IO.FileUtils.ReadFiles ();
        //    int index = 0;
        //    foreach (var fileName in backuplist) {
        //        index++;
        //        /// <summary>
        //        /// 如果是特殊的注册登陆文件,则不需要备份到服务器
        //        /// </summary>
        //        if (fileName == UserInfo.GlobalRegisterFile) {
        //            continue;
        //        }
        //        //整理数据
        //        var datainfo = new FileInfoData ();
        //        datainfo.BackupFileName = fileName;
        //        datainfo.BackupFileContent = Shared.IO.FileUtils.ReadFile (fileName);
        //        var list = new List<FileInfoData> ();
        //        list.Add (datainfo);
        //        var upData = new UploadHomeAppGatewaySubFilesObj ();
        //        upData.HomeId = UserConfig.Instance.CurrentRegion.Id;
        //        upData.BackupClassId = mBackupClassId;
        //        upData.UploadSubFileLists = list;
        //        //获取控制主人账号的Token
        //        upData.LoginAccessToken = MainPage.LoginUser.LoginTokenString;
        //        string urlHead = MainPage.RequestHttpsHost;
        //        if (upData.IsOtherAccountCtrl) {
        //            urlHead = UserConfig.Instance.MasterAccountRequestBaseUrl;
        //            upData.LoginAccessToken = UserConfig.Instance.MasterAccountToken;
        //        }
        //        //AddUserBackupObj requestObj2 = new AddUserBackupObj () { LevelID = Convert.ToInt32 (revertObj.ResponseData), Name = fileName, DetailByte = IO.FileUtils.ReadFile (fileName) };
        //        var requestJson2 = Newtonsoft.Json.JsonConvert.SerializeObject (upData);
        //        var revertObj2 = MainPage.RequestHttps (API.UploadHomeAppGatewaySubFiles, requestJson2, urlHead);
        //        if (revertObj2.StateCode.ToUpper () == StateCode.SUCCESS) {
        //            //index++;
        //            Application.RunOnMainThread (() => {
        //                int pro = (int)(index * 1.0 / backuplist.Count * 100);
        //                MainPage.Loading.Text = pro.ToString () + "%";
        //            });
        //        } else {
        //            //提示错误
        //            break;
        //        }
        //    }
        //    if (index != backuplist.Count) {
        //        //2020-01-11
        //        DeleteFolderDataAfterUploadFailed (mBackupClassId);
        //        Shared.Application.RunOnMainThread (() => {
        //            new Alert ("", "Upload failed!", Language.StringByID (R.MyInternationalizationString.Close)).Show ();
        //            MainPage.Loading.Hide ();
        //        });
        //    }
        //    //Shared.Application.RunOnMainThread (() => {
        //    //    if (index == 0) {
        //    //        new Alert ("", "Upload failed!", Language.StringByID (R.MyInternationalizationString.Close)).Show ();
        //    //    }
        //    //    MainPage.Loading.Hide ();
        //    //});
        //}
        /// <summary>
        /// 用户恢复文件
        /// </summary>
        public void UserBakeupFileDetailedInformation (string BackupClassId)
        public void UserBakeupFileDetailedInformation (string folderId)
        {
            //是否确定恢复该文件数据信息
            Alert alert = new Alert ("", Language.StringByID (R.MyInternationalizationString.SureToRestoreFileInformation), Language.StringByID (R.MyInternationalizationString.Cancel), Language.StringByID (R.MyInternationalizationString.Confrim));
            Alert alert = new Alert (Language.StringByID (R.MyInternationalizationString.Tip), Language.StringByID (R.MyInternationalizationString.SureToRestoreFileInformation), Language.StringByID (R.MyInternationalizationString.Cancel), Language.StringByID (R.MyInternationalizationString.Confrim));
            alert.ResultEventHandler += (sender2, e2) => {
                if (e2) {
                    MainPage.Loading.Start ("Download...");
                    System.Threading.Tasks.Task.Run (() => {
                        try {
                            var fileNames = IO.FileUtils.ReadFiles ();
                            foreach (var fileName in fileNames) {
                                if (fileName == UserInfo.GlobalRegisterFile) {
                                    continue;
                                }
                                IO.FileUtils.DeleteFile (fileName);
                            }
                            ReadFilesAndDelete ();
                            var requestObj2 = new GetHomeDataBackupUploadListPaggerObj ();
                            requestObj2.HomeId = UserConfig.Instance.CurrentRegion.Id;
                            requestObj2.BackupClassId = BackupClassId;
                            requestObj2.PageSetting.PageSize = 999999;
                            requestObj2.PageSetting.Page = 1;
                            //获取控制主人账号的Token
                            requestObj2.LoginAccessToken = MainPage.LoginUser.LoginTokenString;
                            string urlHead = MainPage.RequestHttpsHost;
                            if (requestObj2.IsOtherAccountCtrl) {
                                urlHead = UserConfig.Instance.MasterAccountRequestBaseUrl;
                                requestObj2.LoginAccessToken = UserConfig.Instance.MasterAccountToken;
                            }
                            var revertObj = HttpServerRequest.Current.GetBackupFolderAllFileList (folderId);
                            if (revertObj.Code == StateCode.SUCCESS) {
                            //获取所有文件组名
                            //var requestObj2 = new UserBackupListObj () { LevelID = folderID };
                            var requestJson2 = Newtonsoft.Json.JsonConvert.SerializeObject (requestObj2);
                            var revertObj2 = MainPage.RequestHttps (API.GetHomeDataBackupUploadListPagger, requestJson2, urlHead);
                            if (revertObj2.StateCode.ToUpper () == StateCode.SUCCESS) {
                                var fileListData = Newtonsoft.Json.JsonConvert.DeserializeObject<LoadBackInfoResult> (revertObj2.ResponseData.ToString ());
                                var responseDataObj = fileListData.PageData;
                                ////获取文件名字
                                //List<string> listFileName = new List<string> ();
                                //foreach (LoadBackupFileNameInfo file in fileListData.PageData) {
                                //    listFileName.Add (file.BackupFileName);
                                //}
                                //var responseDataObj = Newtonsoft.Json.JsonConvert.DeserializeObject<List<BackupInfoRes>> (revertObj2.ResponseData.ToString ());
                                var fileListData = Newtonsoft.Json.JsonConvert.DeserializeObject<List<BackupFileInfoRes>> (revertObj.Data.ToString ());
                                var mDownLoad = new DownloadSomeDataBackupObj ();
                                mDownLoad.HomeId = UserConfig.Instance.CurrentRegion.Id;
                                mDownLoad.BackupClassId = BackupClassId;
                                //获取控制主人账号的Token
                                mDownLoad.LoginAccessToken = MainPage.LoginUser.LoginTokenString;
                                string mUrlHead = MainPage.RequestHttpsHost;
                                if (mDownLoad.IsOtherAccountCtrl) {
                                    urlHead = UserConfig.Instance.MasterAccountRequestBaseUrl;
                                    mDownLoad.LoginAccessToken = UserConfig.Instance.MasterAccountToken;
                                }
                                MultiThreadDownload (fileListData, folderId);
                                MultiThreadDownload (responseDataObj, mDownLoad, mUrlHead);
                                //int index = 0;
                                //foreach (var file in responseDataObj) {
                                //    index++;
                                //    if (file.BackupFileName == "null" || "UserConfig" == file.BackupFileName) {
                                //        continue;
                                //    }
                                //    mDownLoad.BackupFileName = file.BackupFileName;
                                //    //var requestObj3 = new BackupDetailObj () { Id = file.Id };
                                //    var requestJson3 = Newtonsoft.Json.JsonConvert.SerializeObject (mDownLoad);
                                //    var revertObj3 = MainPage.RequestHttpsReturnByte (API.DownloadSomeDataBackup, requestJson3, false, mUrlHead);
                                //    if (revertObj3 != null) {
                                //        IO.FileUtils.WriteFileByBytes (file.BackupFileName, revertObj3);
                                //        Application.RunOnMainThread (() => {
                                //            int pro = (int)(index * 1.0 / responseDataObj.Count * 100);
                                //            MainPage.Loading.Text = pro.ToString () + "%";
                                //        });
                                //    } else {
                                //        break;
                                //    }
                                //}
                                //if (index != responseDataObj.Count) {
                                //    //删除已经下载的文件个数错误
                                //    var fileNames2 = IO.FileUtils.ReadFiles ();
                                //    foreach (var fileName in fileNames2) {
                                //        if (fileName == UserInfo.GlobalRegisterFile) {
                                //            continue;
                                //        }
                                //        IO.FileUtils.DeleteFile (fileName);
                                //    }
                                //    MainPage.ShowAlertOnMainThread ("Download failed!");
                                //    return;
                                //}
                                //MainPage.LoginUser.SaveUserInfo ();
                                //Room.InitAllRoom ();
                                //Application.RunOnMainThread (() => {
                                //    this.RemoveFromParent ();
                                //    CommonPage.IsRemote = false;
                                //    UserMiddle.Init ();
                                //    EquipmentPublicClass.CheckLinkRemote (UserConfig.Instance.internetStatus);
                                //    new Alert ("", Language.StringByID (R.MyInternationalizationString.RestoreFileIsSuccessfull),
                                //   Language.StringByID (R.MyInternationalizationString.Close)).Show ();
                                //});
                                //MainPage.LoginUser = Newtonsoft.Json.JsonConvert.DeserializeObject<UserInfo> (System.Text.Encoding.UTF8.GetString (Shared.IO.FileUtils.ReadFile (UserInfo.GlobalRegisterFile)));
                                //if (MainPage.LoginUser != null) {
                                //    MainPage.LoginUser.LastTime = System.DateTime.Now;
                                //    MainPage.LoginUser.SaveUserInfo ();
                                //}
                            } else {
                                //提示错误
                                IMessageCommon.Current.ShowErrorInfoAlter (revertObj.Code);
                            }
                        } catch (Exception ex) {
                            Shared.Application.RunOnMainThread (() => {
                                new Alert ("", Language.StringByID (R.MyInternationalizationString.CheckInternet),
                                new Alert (Language.StringByID (R.MyInternationalizationString.Tip), Language.StringByID (R.MyInternationalizationString.CheckInternet),
                                           Language.StringByID (R.MyInternationalizationString.Close)).Show ();
                            });
                            Utlis.WriteLine (ex.ToString ());
                            Shared.Utlis.WriteLine (ex.ToString ());
                        } finally {
                            Shared.Application.RunOnMainThread (() => {
                                MainPage.Loading.Hide ();
@@ -883,29 +441,11 @@
            alert.Show ();
        }
        bool DownloadSomeDataBackup (DownloadSomeDataBackupObj mmDownLoad, string mUrlHead, LoadBackupFileNameInfo file)
        {
            DownloadSomeDataBackupObj mDownLoad = mmDownLoad;
            mDownLoad.BackupFileName = file.BackupFileName;
            //var requestObj3 = new BackupDetailObj () { Id = file.Id };
            var requestJson3 = Newtonsoft.Json.JsonConvert.SerializeObject (mDownLoad);
            var revertObj3 = MainPage.RequestHttpsReturnByteNew (API.DownloadSomeDataBackup, requestJson3, mUrlHead);
            if (revertObj3 != null) {
                IO.FileUtils.WriteFileByBytes (file.BackupFileName, revertObj3);
                return true;
            } else {
                return false;
            }
        }
        /// <summary>
        /// 删除本地文件
        /// </summary>
        void ReadFilesAndDelete ()
        {
            var fileNames = IO.FileUtils.ReadFiles ();
            foreach (var fileName in fileNames) {
                if (fileName == UserInfo.GlobalRegisterFile || fileName == UserConfig.configFile) {
@@ -916,25 +456,29 @@
        }
        /// <summary>
        ///
        /// </summary>
        private readonly object SendLocker = new object ();
        /// <summary>
        ///
        /// </summary>
        private readonly object DownloadLocker = new object ();
        /// <summary>
        /// 多线程下载
        /// </summary>
        void MultiThreadDownload (List<LoadBackupFileNameInfo> dataList, DownloadSomeDataBackupObj mDownLoad, string mUrlHead, int maxThreads = 5)
        void MultiThreadDownload (List<BackupFileInfoRes> dataList, string folderId, int maxThreads = 5)
        {
            int index = 0;
            int indexCount = 0;
            var mFileList = dataList.FindAll ((obj) => obj.BackupFileName != "null" && obj.BackupFileName != UserConfig.configFile && obj.BackupFileName != UserInfo.GlobalRegisterFile && obj.BackupFileName != "AccountListDB" && obj.BackupFileName != CommonConfig.ConfigFile);
            var mFileList = dataList.FindAll ((obj) => obj.fileName != "null" && obj.fileName != UserConfig.configFile && obj.fileName != UserInfo.GlobalRegisterFile && obj.fileName != "AccountListDB" && obj.fileName != CommonConfig.ConfigFile);
            if (maxThreads > mFileList.Count) {
                maxThreads = mFileList.Count;
            }
            if (mFileList.Count <= 0) return;
            int resultCount = mFileList.Count / maxThreads;
@@ -958,43 +502,25 @@
                    for (var j = startIndex1; j <= endIndex1; j++) {
                        try {
                            //如果失败重新下载,重复3次
                            int errorCount = 0;
                            while (errorCount < 3) {
                                var result = DownloadSomeDataBackup (mDownLoad, mUrlHead, mFileList [j]);
                                if (result) {
                                    lock (DownloadLocker) {
                                        index++;
                                    }
                                    Application.RunOnMainThread (() => {
                                        int pro = (int)(index * 1.0 / mFileList.Count * 100);
                                        MainPage.Loading.Text = pro.ToString () + "%";
                                    });
                                    errorCount = 3;
                                } else {
                                    errorCount++;
                                    Utlis.WriteLine ($"下载失败: {mFileList [j].BackupFileName} 次数:{errorCount}");
                            var result = DownloadSomeDataBackup (folderId, mFileList [j]);
                            if (result) {
                                lock (DownloadLocker) {
                                    index++;
                                }
                                //index++;
                                Application.RunOnMainThread (() => {
                                    int pro = (int)(index * 1.0 / mFileList.Count * 100);
                                    MainPage.Loading.Text = pro.ToString () + "%";
                                });
                            }
                        } catch { } finally {
                            lock (SendLocker) {
                                indexCount++;
                            }
                        }
                        //var t1 = DateTime.Now.Second;
                        //var result = DownloadSomeDataBackup (mDownLoad, mUrlHead, mFileList [j]);
                        //if (result) {
                        //    index++;
                        //    Application.RunOnMainThread (() => {
                        //        int pro = (int)(index * 1.0 / mFileList.Count * 100);
                        //        MainPage.Loading.Text = pro.ToString () + "%";
                        //    });
                        //} else {
                        //    Utlis.WriteLine ($"下载失败: {mFileList [j].BackupFileName} 时间:{DateTime.Now.Second - t1}S");
                        //}
                        //indexCount++;
                        //Utlis.WriteLine ($"下载线程:{id}  完成index:{j}  indexCount: {indexCount}");
                    }
@@ -1026,200 +552,48 @@
            MainPage.LoginUser.SaveUserInfo ();
            Room.InitAllRoom ();
            Application.RunOnMainThread (() => {
                this.RemoveFromParent ();
                //CommonPage.IsRemote = false;
                UserMiddle.Init ();
                EquipmentPublicClass.CheckLinkRemote (UserConfig.Instance.internetStatus);
                new Alert ("", Language.StringByID (R.MyInternationalizationString.RestoreFileIsSuccessfull),
               Language.StringByID (R.MyInternationalizationString.Close)).Show ();
            });
            MainPage.LoginUser = Newtonsoft.Json.JsonConvert.DeserializeObject<UserInfo> (System.Text.Encoding.UTF8.GetString (Shared.IO.FileUtils.ReadFile (UserInfo.GlobalRegisterFile)));
            if (MainPage.LoginUser != null) {
                MainPage.LoginUser.LastTime = System.DateTime.Now;
                MainPage.LoginUser.SaveUserInfo ();
            }
        }
        bool UploadDataBackup (UploadHomeAppGatewaySubFilesObj upData, string mUrlHead, List<string> fileList, int startIndex1, int endIndex1)
        {
            try {
                var list = new List<FileInfoData> ();
                for (var j = startIndex1; j <= endIndex1; j++) {
                    var datainfo = new FileInfoData ();
                    datainfo.BackupFileName = fileList [j];
                    datainfo.BackupFileContent = Shared.IO.FileUtils.ReadFile (fileList [j]);
                    list.Add (datainfo);
                }
                //整理数据
                UploadHomeAppGatewaySubFilesObj mUpData = upData;
                mUpData.UploadSubFileLists = list;
                var requestJson2 = Newtonsoft.Json.JsonConvert.SerializeObject (mUpData);
                var revertObj2 = MainPage.RequestHttps (API.UploadHomeAppGatewaySubFiles, requestJson2, mUrlHead);
                if (revertObj2.StateCode.ToUpper () == StateCode.SUCCESS) {
                    return true;
                } else {
                    //提示错误
                    return false;
                }
            } catch {
                return false;
            }
        }
        /// <summary>
        /// 上传备份文件
        /// 多次上传多个文件
        /// </summary>
        /// <param name="mBackupClassId"></param>
        void UpLoadBackupFileToDBNew (string mBackupClassId, int maxThreads = 20)
        {
            var backuplist = IO.FileUtils.ReadFiles ();
            var mFileList = backuplist.FindAll ((obj) => obj != "null" && obj != UserConfig.configFile && obj != UserInfo.GlobalRegisterFile && obj != "AccountListDB" && obj != CommonConfig.ConfigFile);
            if (mFileList.Count <= 0) return;
            if (maxThreads > mFileList.Count) {
                maxThreads = mFileList.Count;
            }
            int index = 0;
            int indexCount = 0;
            int resultCount = mFileList.Count / maxThreads;
            var upData = new UploadHomeAppGatewaySubFilesObj ();
            upData.HomeId = UserConfig.Instance.CurrentRegion.Id;
            upData.BackupClassId = mBackupClassId;
            //获取控制主人账号的Token
            upData.LoginAccessToken = MainPage.LoginUser.LoginTokenString;
            string urlHead = MainPage.RequestHttpsHost;
            if (upData.IsOtherAccountCtrl) {
                urlHead = UserConfig.Instance.MasterAccountRequestBaseUrl;
                upData.LoginAccessToken = UserConfig.Instance.MasterAccountToken;
            }
            for (int i = 1; i <= resultCount; i++) {
                int startIndex = ((i - 1) * maxThreads + 0);
                int endIndex = maxThreads * i - 1;
                if (i == resultCount) {
                    /*最后一个线程* */
                    endIndex = mFileList.Count - 1;
                }
                var id = i;
                var startIndex1 = startIndex;
                var endIndex1 = endIndex;
                //2020-06-10 修改大图片大文件处理
                var result = UploadDataBackupNew (upData, urlHead, mFileList, startIndex1, endIndex1);
                if (result) {
                    index++;
                    Application.RunOnMainThread (() => {
                        int pro = (int)(index * 1.0 / resultCount * 100);
                        MainPage.Loading.Text = pro.ToString () + "%";
                    });
                }
                indexCount++;
            }
            Utlis.WriteLine ($"上传完成");
            if (index != resultCount) {
                //2020-01-11 备份失败
                DeleteFolderDataAfterUploadFailed (mBackupClassId);
                Shared.Application.RunOnMainThread (() => {
                    new Alert ("", Language.StringByID (R.MyInternationalizationString.FailedToBackupFile), Language.StringByID (R.MyInternationalizationString.Close)).Show ();
                    MainPage.Loading.Hide ();
                });
                return;
            }
            Application.RunOnMainThread (() => {
                //MainPage.Loading.Text = "100%";
                new Alert ("", Language.StringByID (R.MyInternationalizationString.BackupFileIsSuccessful), Language.StringByID (R.MyInternationalizationString.Close)).Show ();
            });
        }
        /// <summary>
        /// 2020-06-05 需要等待云端增加接口
        /// 处理大文件和图片上传
        ///
        /// </summary>
        /// <param name="upData"></param>
        /// <param name="mUrlHead"></param>
        /// <param name="fileList"></param>
        /// <param name="startIndex1"></param>
        /// <param name="endIndex1"></param>
        /// <returns></returns>
        bool UploadDataBackupNew (UploadHomeAppGatewaySubFilesObj upData, string mUrlHead, List<string> fileList, int startIndex1, int endIndex1)
        {
            try {
                var list = new List<FileInfoData> ();
                for (var j = startIndex1; j <= endIndex1; j++) {
                    var datainfo = new FileInfoData ();
                    datainfo.BackupFileName = fileList [j];
                    datainfo.BackupFileContent = Shared.IO.FileUtils.ReadFile (fileList [j]);
                    if (datainfo.BackupFileContent.Length > 1024 * 10) {
                        var upDataBig = new UploadHomeAppGatewaySubFilesBigObj ();
                        upDataBig.RequestVersion = upData.RequestVersion;
                        upDataBig.HomeId = upData.HomeId;
                        upDataBig.BackupClassId = upData.BackupClassId;
                        upDataBig.FileName = fileList [j];
                        upDataBig.IsOtherAccountCtrl = upData.IsOtherAccountCtrl;
                        var revertObj5 = MainPage.RequestHttpsNewBig (API.UploadHomeAppGatewaySingleSubFile, datainfo.BackupFileContent, upDataBig, mUrlHead);
                    } else {
                        list.Add (datainfo);
                    }
                }
                //整理数据
                UploadHomeAppGatewaySubFilesObj mUpData = upData;
                mUpData.UploadSubFileLists = list;
                //var requestJson2 = Newtonsoft.Json.JsonConvert.SerializeObject (mUpData);
                //var revertObj2 = MainPage.RequestHttps (API.UploadHomeAppGatewaySubFiles, requestJson2, mUrlHead);
                //if (revertObj2.StateCode.ToUpper () == StateCode.SUCCESS) {
                //    return true;
                //} else {
                //    //提示错误
                //    return false;
                //if (CommonPage.IsRemote) {
                //    SmartHome.MqttCommon.DisConnectRemote("UserBakeupFileDetailedInformation");
                //}
                this.RemoveFromParent ();
                UserMiddle.Init (true, true);
                EquipmentPublicClass.CheckLinkRemote (UserConfig.Instance.internetStatus);
                new Alert (Language.StringByID (R.MyInternationalizationString.Tip), Language.StringByID (R.MyInternationalizationString.RestoreFileIsSuccessfull),
                Language.StringByID (R.MyInternationalizationString.Close)).Show ();
            });
                //2020-11-16 如果失败重新上传,重复3次
                int errorCount = 0;
                var result = false;
                while (errorCount < 3) {
                    var requestJson2 = Newtonsoft.Json.JsonConvert.SerializeObject (mUpData);
                    var revertObj2 = MainPage.RequestHttps (API.UploadHomeAppGatewaySubFiles, requestJson2, mUrlHead, MainPage.TIME_OUT_20);
                    if (revertObj2.StateCode.ToUpper () == StateCode.SUCCESS) {
                        result = true;
                        errorCount = 3;
                    } else {
                        errorCount++;
                        //Utlis.WriteLine ($"上传失败({startIndex1}-{endIndex1}),次数:{errorCount}");
                    }
                }
                return result;
            } catch {
        }
        /// <summary>
        /// 下载单个备份文件
        /// </summary>
        /// <param name="mmDownLoad"></param>
        /// <param name="mUrlHead"></param>
        /// <param name="file"></param>
        /// <returns></returns>
        bool DownloadSomeDataBackup (string folderId, BackupFileInfoRes file)
        {
            var requestJson = Newtonsoft.Json.JsonConvert.SerializeObject (new BackupFileDownObj () {
                folderId = folderId,
                fileId = file.id,
                homeId = UserConfig.Instance.CurrentRegion.Id
            });
            var revertObj = HttpUtil.RequestHttpsDownload (NewAPI.API_POST_File_Down, requestJson, null, UserConfig.Instance.CurrentRegion.regionUrl);
            if (revertObj != null) {
                Utlis.WriteLine ("DownloadSomeDataBackup: " + file.fileName);
                IO.FileUtils.WriteFileByBytes (file.fileName, revertObj);
                return true;
            } else {
                return false;
            }
        }
        #region 备上传和下载相关接口封装
        #endregion
    }
}