黄学彪
2020-04-15 23532fa8ad34c89b6d24b01eaef6475fd0aad898
ZigbeeApp/Shared/Phone/Login/AccountLogin.cs
@@ -133,7 +133,7 @@
            {
                Width = LayoutParams.MatchParent,
                Height = Application.GetRealHeight(CommonPage.AppRealHeight),
                BackgroundColor =ZigbeeColor.Current.GXCBackgroundColor
                BackgroundColor = ZigbeeColor.Current.GXCBackgroundColor
            };
            AddChidren(midFrameLayout);
            #endregion
@@ -173,774 +173,9 @@
                Gravity = Gravity.CenterHorizontal,
                TextID = R.MyInternationalizationString.AppName,
                TextColor = ZigbeeColor.Current.GXCTextWhiteColor,
                TextSize=16
                TextSize = 16
            };
            midFrameLayout.AddChidren(logoName);
            phoneEmailForm = new PhoneEmailForm();
            phoneEmailForm.Init(midFrameLayout);
            //错误提示Btn
            loginErrorBtn = new Button()
            {
                X = Application.GetRealWidth(242),
                Y = Application.GetRealHeight(740),
                Width = Application.GetRealWidth(700),
                Height = Application.GetRealHeight(58),
                TextColor = ZigbeeColor.Current.GXCTextRed,
                TextAlignment = TextAlignment.CenterLeft,
                TextSize=CommonFormResouce.TextSize,
                IsBold=true
            };
            midFrameLayout.AddChidren(loginErrorBtn);
            accountPwdFL = new FrameLayout()
            {
                Y = Application.GetRealHeight(801),
                Height = Application.GetRealHeight(553),
                Width = Application.GetRealWidth(942),
                Gravity = Gravity.CenterHorizontal,
                BackgroundColor = ZigbeeColor.Current.GXCBackgroundColor,
                Radius = (uint)Application.GetRealHeight(17)
            };
            midFrameLayout.AddChidren(accountPwdFL);
            AddPhoneOrEmailFL(accountPwdFL, "Phone");
            forgotPasswordBtn = new Button()
            {
                X = Application.GetRealWidth(CommonPage.AppRealWidth - 115 - 250),
                Y = Application.GetRealHeight(1198),
                Width = Application.GetRealWidth(250),
                Height = Application.GetRealHeight(58),
                TextID = R.MyInternationalizationString.ForgotPWD_1,
                TextSize = CommonFormResouce.loginTextSize,
                TextColor = Shared.Common.ZigbeeColor.Current.GXCTextGrayColor,
                TextAlignment = TextAlignment.CenterRight
            };
            midFrameLayout.AddChidren(forgotPasswordBtn);
            loginBtn = new Button()
            {
                Y = Application.GetRealHeight(1293),
                Width = Application.GetRealWidth(688),
                Height = Application.GetRealHeight(127),
                Gravity = Gravity.CenterHorizontal,
                TextID = R.MyInternationalizationString.Login,
                TextSize = 16,
                TextColor = ZigbeeColor.Current.GXCTextGrayColor,
                SelectedTextColor = ZigbeeColor.Current.GXCTextWhiteColor,
                SelectedBackgroundColor = ZigbeeColor.Current.GXCButtonBlackSelectedColor,
                BackgroundColor = ZigbeeColor.Current.GXCButtonUnSelectedColor,
                Radius = (uint)Application.GetRealHeight(127 / 2),
                Enable = false,
                IsBold=true
            };
            midFrameLayout.AddChidren(loginBtn);
            loginByCodeBtn = new Button()
            {
                X=Application.GetRealWidth(98),
                Y = Application.GetRealHeight(1466),
                Width = Application.GetRealWidth(300),
                Height = Application.GetRealHeight(49),
                TextID = R.MyInternationalizationString.LoginByCode,
                TextColor = ZigbeeColor.Current.GXCTextGrayColor,
                TextAlignment = TextAlignment.CenterLeft,
                TextSize = CommonFormResouce.loginTextSize
            };
            midFrameLayout.AddChidren(loginByCodeBtn);
            registerBtn = new Button()
            {
                X = Application.GetRealWidth(738),
                Y = Application.GetRealHeight(1466),
                Width = Application.GetRealWidth(244),
                Height = Application.GetRealHeight(49),
                TextID = R.MyInternationalizationString.Register,
                TextColor = ZigbeeColor.Current.GXCTextGrayColor,
                TextAlignment = TextAlignment.CenterRight,
                TextSize = CommonFormResouce.loginTextSize
            };
            midFrameLayout.AddChidren(registerBtn);
            wechatBtn = new Button
            {
                X = Application.GetRealWidth(395),
                Y = Application.GetRealHeight(1737),
                Width = Application.GetMinRealAverage(115),
                Height = Application.GetMinRealAverage(115),
                UnSelectedImagePath = "Account/Wechat.png",
                Gravity=Gravity.CenterHorizontal
            };
            midFrameLayout.AddChidren(wechatBtn);
            qqBtn = new Button
            {
                X = Application.GetRealWidth(567),
                Y = Application.GetRealHeight(1737),
                Width = Application.GetMinRealAverage(115),
                Height = Application.GetMinRealAverage(115),
                UnSelectedImagePath = "Account/QQ.png"
            };
            //midFrameLayout.AddChidren(qqBtn);
            #endregion
            BindEvent();
            if (account.Contains("@") == true)
            {
                SelectPhoneOrEmail_MouseUpEvent(phoneEmailForm.SelectedEmail, null);
            }
        }
        #endregion
        #region ◆ 绑定事件_________________________
        /// <summary>
        /// 绑定按钮事件
        /// </summary>
        private void BindEvent()
        {
            //选择手机邮箱
            phoneEmailForm.SelectedPhone.MouseUpEventHandler += SelectPhoneOrEmail_MouseUpEvent;
            phoneEmailForm.SelectedEmail.MouseUpEventHandler += SelectPhoneOrEmail_MouseUpEvent;
            //登录事件
            loginBtn.MouseUpEventHandler += LoginBtnEvent;
            //短信登录
            loginByCodeBtn.MouseUpEventHandler += LoginByCode;
            //注册事件
            registerBtn.MouseUpEventHandler += Register;
            //忘记密码
            forgotPasswordBtn.MouseUpEventHandler += ForgetPWD_MouseUpEvent;
            //wechat
            wechatBtn.MouseUpEventHandler += LoginByWechat;
            //qq
            qqBtn.MouseUpEventHandler += LoginByQQ;
        }
        #endregion
        #region ◆ 登录____________________________
        /// <summary>
        /// 登录事件
        /// </summary>
        /// <param name="sender">Sender.</param>
        /// <param name="mouseEventArgs">The ${ParameterType} instance containing the event data.</param>
        private void LoginBtnEvent(object sender,MouseEventArgs mouseEventArgs)
        {
            if (phoneEmailForm.SelectedPhone.IsSelected)
            {
                Login(phoneRow.AccountET.Text.Trim(), phonePwdRow.PasswrodET.Text.Trim());
            }
            else
            {
                Login(emailRow.AccountET.Text.Trim(), emailPwdRow.PasswrodET.Text.Trim());
            }
        }
        /// <summary>
        /// 登录
        /// </summary>
        /// <param name="accountStr">Account.</param>
        /// <param name="passwordStr">Password.</param>
        private void Login(string accountStr, string passwordStr)
        {
            //Application.RunOnMainThread( () =>
            //{
            Action action = async () =>
            {
                try
                {
                    if(CheckAccount(accountStr)==false)
                    {
                        return;
                    }
                    CommonPage.Loading.Start(Language.StringByID(R.MyInternationalizationString.Logining));
                    var requestObj = new SendDataToServer.LoginObj
                    {
                        Account = accountStr,
                        Password = passwordStr,
                        Source = CommonPage.Source,
                        Company = CommonPage.Company
                    };
                    var requestJson = Newtonsoft.Json.JsonConvert.SerializeObject(requestObj);
                    var revertObj = await CommonPage.Instance.RequestHttpsZigbeeAsync("ZigbeeUsers/Login", System.Text.Encoding.UTF8.GetBytes(requestJson));
                    if (revertObj == null)
                    {
                        CommonPage.Instance.FailureToServer();
                        CommonPage.Loading.Hide();
                        return;
                    }
                    var stateCodeStr = revertObj.StateCode.ToUpper();
                    //Error 不能直接从服务器取,只能根据状态码逐一判断
                    if (stateCodeStr == "SUCCESS")
                    {
                        if (revertObj.ResponseData == null)
                        {
                            return;
                        }
                        HomePage.Instance.ShowLoginLoadView();
                        new System.Threading.Thread(async () =>
                        {
                            //存储数据
                            var responseDataObj = Newtonsoft.Json.JsonConvert.DeserializeObject<Shared.Common.ResponseEntity.UserLoginRes>(revertObj.ResponseData.ToString());
                            var revertData = responseDataObj;
                            Config.ReFresh();
                            //标记上一次是不是同一个账号登陆
                            UserCenter.UserCenterResourse.ResidenceOption.TheSameLoginAccount = Config.Instance.Guid == revertData.Guid;
                            Config.Instance.Account = revertData.Account;
                            Config.Instance.Password = passwordStr;
                            Config.Instance.MD5PWD = revertData.MD5PWD;
                            Config.Instance.Guid = revertData.Guid;
                            Config.Instance.LoginDateTime = DateTime.Now;
                            Config.Instance.LoginToken = revertData.Token;
                            if (Config.Instance.AccountList.Find((obj) => obj == revertData.Account) == null)
                            {
                                Config.Instance.AccountList.Add(revertData.Account);
                            }
                            Config.Instance.Save();
                            var resultRegID = await Shared.Common.CommonPage.Instance.PushRegID();
                            var homes = await House.GetHomeLists();
                            //刷新个人中心的内存及线程
                            await UserCenter.UserCenterLogic.InitUserCenterMenmoryAndThread();
                            //启动ZigBee
                            ZigBee.Common.Application.Init();
                            UserCenter.HdlRoomLogic.Current.InitAllRoom();
                            Application.RunOnMainThread(() =>
                            {
                                CommonPage.Loading.Hide();
                                this.RemoveFromParent();
                                CommonPage.Instance.RemoveViewByTag("Login");
                                UserPage.Instance.Fresh();
                            });
                        })
                        { IsBackground = true }.Start();
                    }
                    else if (stateCodeStr == "NOTVERIFY")
                    {
                        CommonPage.Loading.Hide();
                        //未激活
                        loginErrorBtn.TextID = R.MyInternationalizationString.NOTVERIFY;
                    }
                    else if (stateCodeStr == "NOTENABLE")
                    {
                        CommonPage.Loading.Hide();
                        //该用户属于调试账号,并未启用
                        loginErrorBtn.TextID = R.MyInternationalizationString.NOTENABLE;
                    }
                    else if (stateCodeStr == "USERNAMEORPWDERROR")
                    {
                        CommonPage.Loading.Hide();
                        //账号或密码错误
                        loginErrorBtn.TextID = R.MyInternationalizationString.USERNAMEORPWDERROR;
                    }
                    else if (stateCodeStr == "ACCOUNTNOEXISTS")
                    {
                        CommonPage.Loading.Hide();
                        //账号不存在
                        loginErrorBtn.TextID = R.MyInternationalizationString.ACCOUNTNOEXISTS;
                    }
                    else if (stateCodeStr == "YOUDATANOISLOCALREGION")
                    {
                        CommonPage.Loading.Hide();
                        //不在本区域,需要重定向区域后再次请求登录
                        if (revertObj.ResponseData == null)
                        {
                            return;
                        }
                        var responseDataObj = Newtonsoft.Json.JsonConvert.DeserializeObject<Shared.Common.ResponseEntity.UserLoginLocalRegionRes>(revertObj.ResponseData.ToString());
                        CommonPage.RequestHttpsHost = responseDataObj.RegionServer;
                        //再次登录
                        Login(accountStr, passwordStr);
                    }
                    else
                    {
                        loginErrorBtn.TextID = R.MyInternationalizationString.RequestServerFailed;
                    }
                }
                catch (Exception ex)
                {
                    System.Console.WriteLine($"登录失败--{ex.Message}");
                    CommonPage.Loading.Hide();
                    CommonPage.Instance.FailureToServer();
                }
                finally
                {
                    //CommonPage.Loading.Hide();
                }
                //});
            };
            action();
        }
        /// <summary>
        /// CheckAccount
        /// </summary>
        /// <param name="accountStr"></param>
        /// <returns></returns>
        private bool CheckAccount(string accountStr)
        {
            if (phoneEmailForm.SelectedEmail.IsSelected)
            {
                if (AccountLogic.Instance.CheckEmail(accountStr) == false)
                {
                    loginErrorBtn.TextID = R.MyInternationalizationString.TheEmailError;
                    return false;
                }
            }
            else
            {
                if (AccountLogic.Instance.CheckPhone(accountStr) == false)
                {
                    loginErrorBtn.TextID = R.MyInternationalizationString.ThePhoneError;
                    return false;
                }
            }
            return true;
        }
        /// <summary>
        /// 通过验证码登录
        /// </summary>
        /// <param name="sender">Sender.</param>
        /// <param name="mouseEventArgs">The ${ParameterType} instance containing the event data.</param>
        private void LoginByCode(object sender,MouseEventArgs mouseEventArgs)
        {
            //this.RemoveFromParent();
            var loginByCodePage = new AccountLoginByCode();
            CommonPage.Instance.AddChidren(loginByCodePage);
            loginByCodePage.Show();
        }
        /// <summary>
        /// wechat登录
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="mouseEventArgs"></param>
        private void LoginByWechat(object sender, MouseEventArgs mouseEventArgs)
        {
#if Android
            //var alert = new Alert(Language.StringByID(R.MyInternationalizationString.TIP),
            //    Language.StringByID(R.MyInternationalizationString.LoginByWechat),
            //    Language.StringByID(R.MyInternationalizationString.Cancel),
            //    Language.StringByID(R.MyInternationalizationString.Confrim));
            //alert.Show();
            //alert.ResultEventHandler += (send, e) =>
            //{
                //if (e)
                //{
                    com.hdl.home.Application.WXLogin();
                    com.hdl.home.WXEntryActivity.RespAction = (authStr) =>
                    {
                        if (authStr == null)
                        {
                        }
                        else
                        {
                            new System.Threading.Thread(async () =>
                            {
                                var re = await isBindAuthAsync(authStr);
                                if (re)
                                {
                                    Application.RunOnMainThread(() =>
                                    {
                                        //直接登录
                                        HomePage.Instance.ShowLoginLoadView();
                                    });
                                    var resultRegID = await Shared.Common.CommonPage.Instance.PushRegID();
                                    var homes = await House.GetHomeLists();
                                    //刷新个人中心的内存及线程
                                    await UserCenter.UserCenterLogic.InitUserCenterMenmoryAndThread();
                                    //启动ZigBee
                                    ZigBee.Common.Application.Init();
                                    UserCenter.HdlRoomLogic.Current.InitAllRoom();
                                    Application.RunOnMainThread(() =>
                                    {
                                        this.RemoveFromParent();
                                        CommonPage.Instance.RemoveViewByTag("Login");
                                        UserPage.Instance.Fresh();
                                    });
                                }
                                else
                                {
                                    var authRes = Newtonsoft.Json.JsonConvert.DeserializeObject<Common.ResponseEntity.AuthUserRes>(authStr);
                                    Application.RunOnMainThread(() =>
                                    {
                                        var registerPage = new AccountRegister();
                                        Shared.Common.CommonPage.Instance.AddChidren(registerPage);
                                        registerPage.OpenID = authRes.openid;
                                        registerPage.Show();
                                    });
                                }
                            })
                            { IsBackground = true }.Start();
                        }
                    };
                //}
            //};
#endif
#if iOS
            Home.IOS.AppDelegate.WXLogin();
            Home.IOS.AppDelegate.RespAction = (authStr) =>
            {
                if (authStr == null)
                {
                }
                else
                {
                    new System.Threading.Thread(async () =>
                    {
                        var re = await isBindAuthAsync(authStr);
                        if (re)
                        {
                            //直接登录
                            //this.RemoveFromParent();
                            //UserPage.Instance.Fresh();
                            var resultRegID = await Shared.Common.CommonPage.Instance.PushRegID();
                            var homes = await House.GetHomeLists();
                            //启动ZigBee
                            ZigBee.Common.Application.Init();
                            //刷新个人中心的内存及线程
                            await UserCenter.UserCenterLogic.InitUserCenterMenmoryAndThread();
                            UserCenter.HdlRoomLogic.Current.InitAllRoom();
                            Application.RunOnMainThread(() =>
                            {
                                this.RemoveFromParent();
                                UserPage.Instance.Fresh();
                            });
                        }
                        else
                        {
                            var authRes = Newtonsoft.Json.JsonConvert.DeserializeObject<Common.ResponseEntity.AuthUserRes>(authStr);
                            Application.RunOnMainThread(() =>
                            {
                                var registerPage = new AccountRegister();
                                Shared.Common.CommonPage.Instance.AddChidren(registerPage);
                                registerPage.OpenID = authRes.openid;
                                registerPage.Show();
                            });
                        }
                    })
                    { IsBackground = true }.Start();
                }
            };
#endif
        }
        /// <summary>
        /// qq登录
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="mouseEventArgs"></param>
        private void LoginByQQ(object sender, MouseEventArgs mouseEventArgs)
        {
        }
        /// <summary>
        /// 是否已绑定
        /// </summary>
        /// <param name="authStr"></param>
        /// <returns></returns>
        private async System.Threading.Tasks.Task<bool> isBindAuthAsync(string authStr)
        {
            var authRes = Newtonsoft.Json.JsonConvert.DeserializeObject<Common.ResponseEntity.AuthUserRes>(authStr);
            var auth = new SendDataToServer.AuthUser()
            {
                AccessToken = authRes.access_token,
                RefreshToken = authRes.refresh_token,
                OpenID = authRes.openid
            };
            //获取微信昵称
            var strUrl = "https://api.weixin.qq.com/sns/userinfo?access_token=" + authRes.access_token;
            strUrl += "&openid=" + authRes.openid;
            var byteData = await Common.CommonPage.Instance.DoRequestZigbeeHttpsInterface(strUrl, null, null, "GET");
            if (byteData == null)
            {
                return false;
            }
            var receipData = System.Text.Encoding.UTF8.GetString(byteData);
            var nickData = Newtonsoft.Json.JsonConvert.DeserializeObject<UserCenter.NicknameInfo>(receipData);
            auth.UserName = nickData.nickname;
            var requestJson = Newtonsoft.Json.JsonConvert.SerializeObject(auth);
            var revertObj = await CommonPage.Instance.RequestHttpsZigbeeAsync("ZigbeeUsers/InsertOrUpdateAuthUser", System.Text.Encoding.UTF8.GetBytes(requestJson));
            if (revertObj == null)
            {
                return false;
            }
            var stateCodeStr = revertObj.StateCode.ToUpper();
            if (stateCodeStr == "SUCCESS")
            {
                var responseDataObj = Newtonsoft.Json.JsonConvert.DeserializeObject<Shared.Common.ResponseEntity.UserLoginRes>(revertObj.ResponseData.ToString());
                var revertData = responseDataObj;
                //标记上一次是不是同一个账号登陆
                UserCenter.UserCenterResourse.ResidenceOption.TheSameLoginAccount = Config.Instance.Guid == revertData.Guid;
                Config.Instance.Account = revertData.Account;
                Config.Instance.MD5PWD = revertData.MD5PWD;
                Config.Instance.Guid = revertData.Guid;
                Config.Instance.LoginDateTime = DateTime.Now;
                if (Config.Instance.AccountList.Find((obj) => obj == revertData.Account) == null)
                {
                    Config.Instance.AccountList.Add(revertData.Account);
                }
                Config.Instance.Save();
                return true;
            }
            else
            {
                return false;
            }
        }
        /// <summary>
        /// phone/email 选择
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="mouseEventArgs"></param>
        private void SelectPhoneOrEmail_MouseUpEvent(object sender, MouseEventArgs mouseEventArgs)
        {
            phoneEmailForm.SelectedPhone.IsSelected = phoneEmailForm.SelectedEmail.IsSelected = false;
            phoneEmailForm.SelectedPhone.IsBold = phoneEmailForm.SelectedEmail.IsBold = false;
            loginBtn.Enable = loginBtn.IsSelected = false;
            loginErrorBtn.Text = string.Empty;
            (sender as Button).IsSelected = (sender as Button).IsBold = true;
            if((sender as Button).Tag.ToString()=="Phone")
            {
                AddPhoneOrEmailFL(accountPwdFL, "Phone");
            }
            else
            {
                AddPhoneOrEmailFL(accountPwdFL, "Email");
            }
        }
        /// <summary>
        /// AddPhoneOrEmailFL
        /// </summary>
        /// <param name="accountPwdFrameLayout"></param>
        /// <param name="phoneOrEmail"></param>
        private void AddPhoneOrEmailFL(FrameLayout accountPwdFrameLayout,string phoneOrEmail)
        {
            if (phoneOrEmail == "Phone")
            {
                if (phoneRow != null)
                {
                    phoneRow.Visible = true;
                    phonePwdRow.Visible = true;
                    if (emailRow != null)
                    {
                        emailRow.Visible = false;
                        emailPwdRow.Visible = false;
                    }
                    this.Pwd_TextChange(phonePwdRow);
                    return;
                }
                phoneRow = new PhoneLoginRowForm();
                phoneRow.Init(accountPwdFrameLayout, this, this.oldInputPhone, 29, 29);
                phoneRow.AccountET.TextChangeEventHandler += Account_TextChange;
                phonePwdRow = new PwdLoginRowForm();
                phonePwdRow.Init(accountPwdFrameLayout, 29, 225);
                phonePwdRow.PasswrodET.TextChangeEventHandler += (sender, e) =>
                {
                    this.Pwd_TextChange(phonePwdRow);
                };
            }
            else
            {
                if (emailRow != null)
                {
                    emailRow.Visible = true;
                    emailPwdRow.Visible = true;
                    if (phoneRow != null)
                    {
                        phoneRow.Visible = false;
                        phonePwdRow.Visible = false;
                    }
                    this.Pwd_TextChange(emailPwdRow);
                    return;
                }
                emailRow = new EmailLoginRowForm();
                emailRow.Init(accountPwdFrameLayout, this.oldInputEmail, 29, 29);
                emailRow.AccountET.TextChangeEventHandler += Account_TextChange;
                emailPwdRow = new PwdLoginRowForm();
                emailPwdRow.Init(accountPwdFrameLayout, 29, 225);
                emailPwdRow.PasswrodET.TextChangeEventHandler += (sender, e) =>
                {
                    this.Pwd_TextChange(emailPwdRow);
                };
            }
        }
        #endregion
        #region ◆ 忘记密码________________________
        /// <summary>
        /// 忘记密码
        /// </summary>
        private void ForgetPWD_MouseUpEvent(object sender, MouseEventArgs mouseEventArgs)
        {
            var forgot = new AccountForgetPWD();
            CommonPage.Instance.AddChidren(forgot);
            forgot.Show();
        }
        #endregion
        #region ◆ 注册_____________________________
        /// <summary>
        /// 注册
        /// </summary>
        /// <param name="sender">Sender.</param>
        /// <param name="mouseEventArgs">The ${ParameterType} instance containing the event data.</param>
        private void Register(object sender,MouseEventArgs mouseEventArgs)
        {
            var registerPage = new AccountRegister();
            CommonPage.Instance.AddChidren(registerPage);
            registerPage.Show();
        }
        #endregion
        #region ◆ 账号密码监听______________________
        /// <summary>
        /// 账号监听
        /// </summary>
        /// <param name="sender">Sender.</param>
        /// <param name="mouseEventArgs">The ${ParameterType} instance containing the event data.</param>
        private void Account_TextChange(object sender,string mouseEventArgs)
        {
            loginErrorBtn.Text = string.Empty;
        }
        /// <summary>
        /// 密码监听事件
        /// </summary>
        /// <param name="pwdRow">Sender.</param>
        private void Pwd_TextChange(PwdLoginRowForm pwdRow)
        {
            loginErrorBtn.Text = string.Empty;
            string pswText = pwdRow.PasswrodET.Text.Trim();
            if (1 <= pswText.Length && pswText.Length <= 16 && (phoneRow.AccountET.Text.Trim().Length > 0 || emailRow?.AccountET.Text.Trim().Length>0))
            {
                loginBtn.Enable = loginBtn.IsSelected = true;
            }
            else if (pswText.Length > 16)
            {
                pwdRow.PasswrodET.Text = pswText.Substring(0, 16);
                if (phoneRow.AccountET.Text.Trim().Length > 0 || emailRow?.AccountET.Text.Trim().Length > 0)
                {
                    loginBtn.Enable = loginBtn.IsSelected = true;
                }
            }
            else
            {
                loginBtn.Enable = loginBtn.IsSelected = false;
            }
        }
        #endregion
        #region ■ 变量声明___________________________
        /// <summary>
        /// 手机账号登陆的控件容器
        /// </summary>
        private FrameLayout frameAccLoginPhoneback = null;
        /// <summary>
        /// 邮箱账号登陆的控件容器
        /// </summary>
        private FrameLayout frameEmailLoginPhoneback = null;
        #endregion
        #region ■ 初始化_____________________________
        /// <summary>
        /// 界面显示
        /// </summary>
        /// <param name="account">登陆账号</param>
        public void ShowForm(string account = "")
        {
            if (Config.Instance.IsLogin == true)
            {
                return;
            }
            CommonPage.Instance.IsDrawerLockMode = true;
            this.Tag = "Login";
            //界面上部的黑色图片
            var btnTopBlackPic = new NormalViewControl(this.Width, Application.GetRealHeight(619), false);
            btnTopBlackPic.UnSelectedImagePath = "Account/Logo_loginBG.png";
            this.AddChidren(btnTopBlackPic);
            //中间浅白色的背景
            var frameMidBack = new FrameLayout();
            frameMidBack.Y = btnTopBlackPic.Bottom;
            frameMidBack.Height = this.Height - btnTopBlackPic.Bottom;
            frameMidBack.BackgroundColor = ZigbeeColor.Current.GXCGrayBackgroundColor;
            this.AddChidren(frameMidBack);
            //HdlHome的图标
            var btnLogoIcon = new PicViewControl(184, 184);
            btnLogoIcon.Y = Application.GetRealHeight(230);
            btnLogoIcon.UnSelectedImagePath = "Account/Logo_White.png";
            btnLogoIcon.Gravity = Gravity.CenterHorizontal;
            this.AddChidren(btnLogoIcon);
            //Hdl Home
            var btnLogoName = new NormalViewControl(300, 69, true);
            btnLogoName.Y = btnLogoIcon.Bottom;
            btnLogoName.Gravity = Gravity.CenterHorizontal;
            btnLogoName.TextID = R.MyInternationalizationString.AppName;
            btnLogoName.TextColor = ZigbeeColor.Current.GXCTextWhiteColor;
            btnLogoName.TextSize = 16;
            this.AddChidren(btnLogoName);
            //手机号,邮箱的菜单控件
            int defultIndex = account.Contains("@") == false ? 1 : 2;
            var sitchControl = new Controls.PhoneEmailSelectControl();
            sitchControl.Y = Application.GetRealHeight(559);
            this.AddChidren(sitchControl);
            sitchControl.SelectMenuEvent += (selectIndex) =>
            {
                //手机号
                if (selectIndex == 1)
                {
                }
                //邮箱
                else if (selectIndex == 2)
                {
                }
            };
            //执行初始化
            sitchControl.InitControl(ZigbeeColor.Current.GXCButtonSelectedColor, defultIndex);
            phoneEmailForm = new PhoneEmailForm();
            phoneEmailForm.Init(midFrameLayout);
@@ -1051,12 +286,728 @@
            };
            //midFrameLayout.AddChidren(qqBtn);
            //添加服务协议控件
            //this.AddServiceAgreementControl(phoneEmailBGFL);
            #endregion
            BindEvent();
            if (account.Contains("@") == true)
            {
                SelectPhoneOrEmail_MouseUpEvent(phoneEmailForm.SelectedEmail, null);
            }
        }
        #endregion
        #region ◆ 绑定事件_________________________
        /// <summary>
        /// 绑定按钮事件
        /// </summary>
        private void BindEvent()
        {
            //选择手机邮箱
            phoneEmailForm.SelectedPhone.MouseUpEventHandler += SelectPhoneOrEmail_MouseUpEvent;
            phoneEmailForm.SelectedEmail.MouseUpEventHandler += SelectPhoneOrEmail_MouseUpEvent;
            //登录事件
            loginBtn.MouseUpEventHandler += LoginBtnEvent;
            //短信登录
            loginByCodeBtn.MouseUpEventHandler += LoginByCode;
            //注册事件
            registerBtn.MouseUpEventHandler += Register;
            //忘记密码
            forgotPasswordBtn.MouseUpEventHandler += ForgetPWD_MouseUpEvent;
            //wechat
            wechatBtn.MouseUpEventHandler += LoginByWechat;
            //qq
            qqBtn.MouseUpEventHandler += LoginByQQ;
        }
        #endregion
        #region ◆ 登录____________________________
        /// <summary>
        /// 登录事件
        /// </summary>
        /// <param name="sender">Sender.</param>
        /// <param name="mouseEventArgs">The ${ParameterType} instance containing the event data.</param>
        private void LoginBtnEvent(object sender, MouseEventArgs mouseEventArgs)
        {
            //检测隐私协议
            if (this.CheckPrivacyPolicy() == false)
            {
                return;
            }
            if (phoneEmailForm.SelectedPhone.IsSelected)
            {
                Login(phoneRow.AccountET.Text.Trim(), phonePwdRow.PasswrodET.Text.Trim());
            }
            else
            {
                Login(emailRow.AccountET.Text.Trim(), emailPwdRow.PasswrodET.Text.Trim());
            }
        }
        /// <summary>
        /// 登录
        /// </summary>
        /// <param name="accountStr">Account.</param>
        /// <param name="passwordStr">Password.</param>
        private void Login(string accountStr, string passwordStr)
        {
            //Application.RunOnMainThread( () =>
            //{
            Action action = async () =>
            {
                try
                {
                    if (CheckAccount(accountStr) == false)
                    {
                        return;
                    }
                    CommonPage.Loading.Start(Language.StringByID(R.MyInternationalizationString.Logining));
                    var requestObj = new SendDataToServer.LoginObj
                    {
                        Account = accountStr,
                        Password = passwordStr,
                        Source = CommonPage.Source,
                        Company = CommonPage.Company
                    };
                    var requestJson = Newtonsoft.Json.JsonConvert.SerializeObject(requestObj);
                    var revertObj = await CommonPage.Instance.RequestHttpsZigbeeAsync("ZigbeeUsers/Login", System.Text.Encoding.UTF8.GetBytes(requestJson));
                    if (revertObj == null)
                    {
                        CommonPage.Instance.FailureToServer();
                        CommonPage.Loading.Hide();
                        return;
                    }
                    var stateCodeStr = revertObj.StateCode.ToUpper();
                    //Error 不能直接从服务器取,只能根据状态码逐一判断
                    if (stateCodeStr == "SUCCESS")
                    {
                        if (revertObj.ResponseData == null)
                        {
                            return;
                        }
                        HomePage.Instance.ShowLoginLoadView();
                        new System.Threading.Thread(async () =>
                        {
                            //存储数据
                            var responseDataObj = Newtonsoft.Json.JsonConvert.DeserializeObject<Shared.Common.ResponseEntity.UserLoginRes>(revertObj.ResponseData.ToString());
                            var revertData = responseDataObj;
                            Config.ReFresh();
                            //标记上一次是不是同一个账号登陆
                            UserCenter.UserCenterResourse.ResidenceOption.TheSameLoginAccount = Config.Instance.Guid == revertData.Guid;
                            Config.Instance.Account = revertData.Account;
                            Config.Instance.Password = passwordStr;
                            Config.Instance.MD5PWD = revertData.MD5PWD;
                            Config.Instance.Guid = revertData.Guid;
                            Config.Instance.LoginDateTime = DateTime.Now;
                            Config.Instance.LoginToken = revertData.Token;
                            Config.Instance.Save();
                            var resultRegID = await Shared.Common.CommonPage.Instance.PushRegID();
                            var homes = await House.GetHomeLists();
                            //刷新个人中心的内存及线程
                            await UserCenter.UserCenterLogic.InitUserCenterMenmoryAndThread();
                            //启动ZigBee
                            ZigBee.Common.Application.Init();
                            UserCenter.HdlRoomLogic.Current.InitAllRoom();
                            Application.RunOnMainThread(() =>
                            {
                                CommonPage.Loading.Hide();
                                this.RemoveFromParent();
                                CommonPage.Instance.RemoveViewByTag("Login");
                                UserPage.Instance.Fresh();
                            });
                        })
                        { IsBackground = true }.Start();
                    }
                    else if (stateCodeStr == "NOTVERIFY")
                    {
                        CommonPage.Loading.Hide();
                        //未激活
                        loginErrorBtn.TextID = R.MyInternationalizationString.NOTVERIFY;
                    }
                    else if (stateCodeStr == "NOTENABLE")
                    {
                        CommonPage.Loading.Hide();
                        //该用户属于调试账号,并未启用
                        loginErrorBtn.TextID = R.MyInternationalizationString.NOTENABLE;
                    }
                    else if (stateCodeStr == "USERNAMEORPWDERROR")
                    {
                        CommonPage.Loading.Hide();
                        //账号或密码错误
                        loginErrorBtn.TextID = R.MyInternationalizationString.USERNAMEORPWDERROR;
                    }
                    else if (stateCodeStr == "ACCOUNTNOEXISTS")
                    {
                        CommonPage.Loading.Hide();
                        //账号不存在
                        loginErrorBtn.TextID = R.MyInternationalizationString.ACCOUNTNOEXISTS;
                    }
                    else if (stateCodeStr == "YOUDATANOISLOCALREGION")
                    {
                        CommonPage.Loading.Hide();
                        //不在本区域,需要重定向区域后再次请求登录
                        if (revertObj.ResponseData == null)
                        {
                            return;
                        }
                        var responseDataObj = Newtonsoft.Json.JsonConvert.DeserializeObject<Shared.Common.ResponseEntity.UserLoginLocalRegionRes>(revertObj.ResponseData.ToString());
                        CommonPage.RequestHttpsHost = responseDataObj.RegionServer;
                        //再次登录
                        Login(accountStr, passwordStr);
                    }
                    else
                    {
                        loginErrorBtn.TextID = R.MyInternationalizationString.RequestServerFailed;
                    }
                }
                catch (Exception ex)
                {
                    System.Console.WriteLine($"登录失败--{ex.Message}");
                    CommonPage.Loading.Hide();
                    CommonPage.Instance.FailureToServer();
                }
                finally
                {
                    //CommonPage.Loading.Hide();
                }
                //});
            };
            action();
        }
        /// <summary>
        /// CheckAccount
        /// </summary>
        /// <param name="accountStr"></param>
        /// <returns></returns>
        private bool CheckAccount(string accountStr)
        {
            if (phoneEmailForm.SelectedEmail.IsSelected)
            {
                if (AccountLogic.Instance.CheckEmail(accountStr) == false)
                {
                    loginErrorBtn.TextID = R.MyInternationalizationString.TheEmailError;
                    return false;
                }
            }
            else
            {
                if (AccountLogic.Instance.CheckPhone(accountStr) == false)
                {
                    loginErrorBtn.TextID = R.MyInternationalizationString.ThePhoneError;
                    return false;
                }
            }
            return true;
        }
        /// <summary>
        /// 通过验证码登录
        /// </summary>
        /// <param name="sender">Sender.</param>
        /// <param name="mouseEventArgs">The ${ParameterType} instance containing the event data.</param>
        private void LoginByCode(object sender, MouseEventArgs mouseEventArgs)
        {
            //检测隐私协议
            if (this.CheckPrivacyPolicy() == false)
            {
                return;
            }
            //this.RemoveFromParent();
            var loginByCodePage = new AccountLoginByCode();
            CommonPage.Instance.AddChidren(loginByCodePage);
            loginByCodePage.Show();
        }
        /// <summary>
        /// wechat登录
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="mouseEventArgs"></param>
        private void LoginByWechat(object sender, MouseEventArgs mouseEventArgs)
        {
            //检测隐私协议
            if (this.CheckPrivacyPolicy() == false)
            {
                return;
            }
#if Android
            //var alert = new Alert(Language.StringByID(R.MyInternationalizationString.TIP),
            //    Language.StringByID(R.MyInternationalizationString.LoginByWechat),
            //    Language.StringByID(R.MyInternationalizationString.Cancel),
            //    Language.StringByID(R.MyInternationalizationString.Confrim));
            //alert.Show();
            //alert.ResultEventHandler += (send, e) =>
            //{
            //if (e)
            //{
            com.hdl.home.Application.WXLogin();
            com.hdl.home.WXEntryActivity.RespAction = (authStr) =>
            {
                if (authStr == null)
                {
                }
                else
                {
                    new System.Threading.Thread(async () =>
                    {
                        var re = await isBindAuthAsync(authStr);
                        if (re)
                        {
                            Application.RunOnMainThread(() =>
                            {
                                //直接登录
                                HomePage.Instance.ShowLoginLoadView();
                            });
                            var resultRegID = await Shared.Common.CommonPage.Instance.PushRegID();
                            var homes = await House.GetHomeLists();
                            //刷新个人中心的内存及线程
                            await UserCenter.UserCenterLogic.InitUserCenterMenmoryAndThread();
                            //启动ZigBee
                            ZigBee.Common.Application.Init();
                            UserCenter.HdlRoomLogic.Current.InitAllRoom();
                            Application.RunOnMainThread(() =>
                            {
                                this.RemoveFromParent();
                                CommonPage.Instance.RemoveViewByTag("Login");
                                UserPage.Instance.Fresh();
                            });
                        }
                        else
                        {
                            var authRes = Newtonsoft.Json.JsonConvert.DeserializeObject<Common.ResponseEntity.AuthUserRes>(authStr);
                            Application.RunOnMainThread(() =>
                            {
                                var registerPage = new AccountRegister();
                                Shared.Common.CommonPage.Instance.AddChidren(registerPage);
                                registerPage.OpenID = authRes.openid;
                                registerPage.Show();
                            });
                        }
                    })
                    { IsBackground = true }.Start();
                }
            };
            //}
            //};
#endif
#if iOS
            Home.IOS.AppDelegate.WXLogin();
            Home.IOS.AppDelegate.RespAction = (authStr) =>
            {
                if (authStr == null)
                {
                }
                else
                {
                    new System.Threading.Thread(async () =>
                    {
                        var re = await isBindAuthAsync(authStr);
                        if (re)
                        {
                            //直接登录
                            //this.RemoveFromParent();
                            //UserPage.Instance.Fresh();
                            var resultRegID = await Shared.Common.CommonPage.Instance.PushRegID();
                            var homes = await House.GetHomeLists();
                            //启动ZigBee
                            ZigBee.Common.Application.Init();
                            //刷新个人中心的内存及线程
                            await UserCenter.UserCenterLogic.InitUserCenterMenmoryAndThread();
                            UserCenter.HdlRoomLogic.Current.InitAllRoom();
                            Application.RunOnMainThread(() =>
                            {
                                this.RemoveFromParent();
                                UserPage.Instance.Fresh();
                            });
                        }
                        else
                        {
                            var authRes = Newtonsoft.Json.JsonConvert.DeserializeObject<Common.ResponseEntity.AuthUserRes>(authStr);
                            Application.RunOnMainThread(() =>
                            {
                                var registerPage = new AccountRegister();
                                Shared.Common.CommonPage.Instance.AddChidren(registerPage);
                                registerPage.OpenID = authRes.openid;
                                registerPage.Show();
                            });
                        }
                    })
                    { IsBackground = true }.Start();
                }
            };
#endif
        }
        /// <summary>
        /// qq登录
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="mouseEventArgs"></param>
        private void LoginByQQ(object sender, MouseEventArgs mouseEventArgs)
        {
        }
        /// <summary>
        /// phone/email 选择
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="mouseEventArgs"></param>
        private void SelectPhoneOrEmail_MouseUpEvent(object sender, MouseEventArgs mouseEventArgs)
        {
            phoneEmailForm.SelectedPhone.IsSelected = phoneEmailForm.SelectedEmail.IsSelected = false;
            phoneEmailForm.SelectedPhone.IsBold = phoneEmailForm.SelectedEmail.IsBold = false;
            loginBtn.Enable = loginBtn.IsSelected = false;
            loginErrorBtn.Text = string.Empty;
            (sender as Button).IsSelected = (sender as Button).IsBold = true;
            if ((sender as Button).Tag.ToString() == "Phone")
            {
                AddPhoneOrEmailFL(accountPwdFL, "Phone");
            }
            else
            {
                AddPhoneOrEmailFL(accountPwdFL, "Email");
            }
        }
        /// <summary>
        /// AddPhoneOrEmailFL
        /// </summary>
        /// <param name="accountPwdFrameLayout"></param>
        /// <param name="phoneOrEmail"></param>
        private void AddPhoneOrEmailFL(FrameLayout accountPwdFrameLayout, string phoneOrEmail)
        {
            if (phoneOrEmail == "Phone")
            {
                if (phoneRow != null)
                {
                    phoneRow.Visible = true;
                    phonePwdRow.Visible = true;
                    if (emailRow != null)
                    {
                        emailRow.Visible = false;
                        emailPwdRow.Visible = false;
                    }
                    this.Pwd_TextChange(phonePwdRow);
                    return;
                }
                phoneRow = new PhoneLoginRowForm();
                phoneRow.Init(accountPwdFrameLayout, this, this.oldInputPhone, 29, 29);
                phoneRow.AccountET.TextChangeEventHandler += Account_TextChange;
                phonePwdRow = new PwdLoginRowForm();
                phonePwdRow.Init(accountPwdFrameLayout, 29, 225);
                phonePwdRow.PasswrodET.TextChangeEventHandler += (sender, e) =>
                {
                    this.Pwd_TextChange(phonePwdRow);
                };
            }
            else
            {
                if (emailRow != null)
                {
                    emailRow.Visible = true;
                    emailPwdRow.Visible = true;
                    if (phoneRow != null)
                    {
                        phoneRow.Visible = false;
                        phonePwdRow.Visible = false;
                    }
                    this.Pwd_TextChange(emailPwdRow);
                    return;
                }
                emailRow = new EmailLoginRowForm();
                emailRow.Init(accountPwdFrameLayout, this.oldInputEmail, 29, 29);
                emailRow.AccountET.TextChangeEventHandler += Account_TextChange;
                emailPwdRow = new PwdLoginRowForm();
                emailPwdRow.Init(accountPwdFrameLayout, 29, 225);
                emailPwdRow.PasswrodET.TextChangeEventHandler += (sender, e) =>
                {
                    this.Pwd_TextChange(emailPwdRow);
                };
            }
        }
        #endregion
        #region ◆ 忘记密码________________________
        /// <summary>
        /// 忘记密码
        /// </summary>
        private void ForgetPWD_MouseUpEvent(object sender, MouseEventArgs mouseEventArgs)
        {
            //检测隐私协议
            if (this.CheckPrivacyPolicy() == false)
            {
                return;
            }
            var forgot = new AccountForgetPWD();
            CommonPage.Instance.AddChidren(forgot);
            forgot.Show();
        }
        #endregion
        #region ◆ 注册_____________________________
        /// <summary>
        /// 注册
        /// </summary>
        /// <param name="sender">Sender.</param>
        /// <param name="mouseEventArgs">The ${ParameterType} instance containing the event data.</param>
        private void Register(object sender, MouseEventArgs mouseEventArgs)
        {
            //检测隐私协议
            if (this.CheckPrivacyPolicy() == false)
            {
                return;
            }
            var registerPage = new AccountRegister();
            CommonPage.Instance.AddChidren(registerPage);
            registerPage.Show();
        }
        #endregion
        #region ◆ 账号密码监听______________________
        /// <summary>
        /// 账号监听
        /// </summary>
        /// <param name="sender">Sender.</param>
        /// <param name="mouseEventArgs">The ${ParameterType} instance containing the event data.</param>
        private void Account_TextChange(object sender, string mouseEventArgs)
        {
            loginErrorBtn.Text = string.Empty;
        }
        /// <summary>
        /// 密码监听事件
        /// </summary>
        /// <param name="pwdRow">Sender.</param>
        private void Pwd_TextChange(PwdLoginRowForm pwdRow)
        {
            loginErrorBtn.Text = string.Empty;
            string pswText = pwdRow.PasswrodET.Text.Trim();
            if (1 <= pswText.Length && pswText.Length <= 16 && (phoneRow.AccountET.Text.Trim().Length > 0 || emailRow?.AccountET.Text.Trim().Length > 0))
            {
                loginBtn.Enable = loginBtn.IsSelected = true;
            }
            else if (pswText.Length > 16)
            {
                pwdRow.PasswrodET.Text = pswText.Substring(0, 16);
                if (phoneRow.AccountET.Text.Trim().Length > 0 || emailRow?.AccountET.Text.Trim().Length > 0)
                {
                    loginBtn.Enable = loginBtn.IsSelected = true;
                }
            }
            else
            {
                loginBtn.Enable = loginBtn.IsSelected = false;
            }
        }
        #endregion
        #region ■ 变量声明___________________________
        /// <summary>
        /// 错误提示控件
        /// </summary>
        private NormalViewControl btnErrorMsg = null;
        /// <summary>
        /// 是否同意隐私协议
        /// </summary>
        private bool isAgreePrivacyPolicy = true;
        #endregion
        #region ■ 初始化_____________________________
        /// <summary>
        /// 界面显示
        /// </summary>
        /// <param name="account">登陆账号</param>
        public void ShowForm(string account = "")
        {
            if (Config.Instance.IsLogin == true)
            {
                return;
            }
            CommonPage.Instance.IsDrawerLockMode = true;
            this.Tag = "Login";
            //界面上部的黑色图片
            var btnTopBlackPic = new NormalViewControl(this.Width, Application.GetRealHeight(619), false);
            btnTopBlackPic.UnSelectedImagePath = "Account/Logo_loginBG.png";
            this.AddChidren(btnTopBlackPic);
            //中间浅白色的背景
            var frameMidBack = new FrameLayout();
            frameMidBack.Y = btnTopBlackPic.Bottom;
            frameMidBack.Height = this.Height - btnTopBlackPic.Bottom;
            frameMidBack.BackgroundColor = ZigbeeColor.Current.GXCGrayBackgroundColor;
            this.AddChidren(frameMidBack);
            //HdlHome的图标
            var btnLogoIcon = new PicViewControl(184, 184);
            btnLogoIcon.Y = Application.GetRealHeight(230);
            btnLogoIcon.UnSelectedImagePath = "Account/Logo_White.png";
            btnLogoIcon.Gravity = Gravity.CenterHorizontal;
            this.AddChidren(btnLogoIcon);
            //Hdl Home
            var btnLogoName = new NormalViewControl(300, 69, true);
            btnLogoName.Y = btnLogoIcon.Bottom;
            btnLogoName.Gravity = Gravity.CenterHorizontal;
            btnLogoName.TextID = R.MyInternationalizationString.AppName;
            btnLogoName.TextColor = ZigbeeColor.Current.GXCTextWhiteColor;
            btnLogoName.TextAlignment = TextAlignment.Center;
            btnLogoName.TextSize = 16;
            this.AddChidren(btnLogoName);
            //1:手机号  2:邮箱
            int selectIndex = account.Contains("@") == false ? 1 : 2;
            //初始化 手机账号登陆窗口
            var frameAccLoginPhoneback = this.InitAccoutLoginWindow(frameMidBack, selectIndex == 1 ? account : string.Empty, 1);
            //初始化 邮箱账号登陆窗口
            var frameEmailLoginPhoneback = this.InitAccoutLoginWindow(frameMidBack, selectIndex == 1 ? string.Empty : account, 2);
            //初始化 手机账号验证码登陆窗口
            var frameAccCodeLoginPhoneback = this.InitCodeLoginWindow(frameMidBack, selectIndex == 1 ? account : string.Empty, 1);
            //初始化 邮箱账号验证码登陆窗口
            var frameEmailCodeLoginPhoneback = this.InitCodeLoginWindow(frameMidBack, selectIndex == 1 ? string.Empty : account, 2);
            //定义这两个东西,是为了减少判断的代码
            var framePhone = frameAccLoginPhoneback;
            var frameEmail = frameEmailLoginPhoneback;
            //邮箱,手机号的切换控件
            var sitchControl = new Controls.PhoneEmailSelectControl();
            sitchControl.Y = Application.GetRealHeight(559);
            this.AddChidren(sitchControl);
            sitchControl.SelectMenuEvent += (selectMenu) =>
            {
                selectIndex = selectMenu;
                //手机号
                if (selectIndex == 1)
                {
                    framePhone.Visible = true;
                    frameEmail.Visible = false;
                }
                //邮箱
                else if (selectIndex == 2)
                {
                    framePhone.Visible = false;
                    frameEmail.Visible = true;
                }
            };
            //执行初始化
            sitchControl.InitControl(ZigbeeColor.Current.GXCButtonSelectedColor, selectIndex);
            //错误提示控件
            this.btnErrorMsg = new NormalViewControl(700, 60, true);
            btnErrorMsg.Y = frameAccLoginPhoneback.Y - Application.GetRealHeight(60 + 3);
            btnErrorMsg.X = Application.GetRealWidth(288);
            btnErrorMsg.TextColor = ZigbeeColor.Current.GXCTextRed;
            btnErrorMsg.IsBold = true;
            frameMidBack.AddChidren(btnErrorMsg);
            //验证码登陆
            //1:账号登陆  2:验证码登陆
            int codeDiv = 1;
            var btnLoginByCode = new NormalViewControl(300, 100, true);
            btnLoginByCode.X = Application.GetRealWidth(98);
            btnLoginByCode.Y = frameAccLoginPhoneback.Bottom + Application.GetRealHeight(21);
            btnLoginByCode.TextID = R.MyInternationalizationString.LoginByCode;
            btnLoginByCode.TextColor = UserCenterColor.Current.TextGrayColor3;
            btnLoginByCode.TextSize = 12;
            frameMidBack.AddChidren(btnLoginByCode);
            btnLoginByCode.ButtonClickEvent += (sender, e) =>
            {
                if (codeDiv == 1)
                {
                    //验证码登陆
                    codeDiv = 2;
                    btnLoginByCode.TextID = R.MyInternationalizationString.LoginByAccountPWD; //账号登陆
                    //账号登陆的两个东西隐藏
                    frameAccLoginPhoneback.Visible = false;
                    frameEmailLoginPhoneback.Visible = false;
                    //替换这两个东西
                    framePhone = frameAccCodeLoginPhoneback;
                    frameEmail = frameEmailCodeLoginPhoneback;
                }
                else
                {
                    //账号登陆
                    codeDiv = 1;
                    btnLoginByCode.TextID = R.MyInternationalizationString.LoginByCode;//验证码登陆
                    //验证码登陆的两个东西隐藏
                    frameAccCodeLoginPhoneback.Visible = false;
                    frameEmailCodeLoginPhoneback.Visible = false;
                    //替换这两个东西
                    framePhone = frameAccLoginPhoneback;
                    frameEmail = frameEmailLoginPhoneback;
                }
                //刷新菜单
                sitchControl.SetSelectIndex(1);
            };
            //注册用户
            var btnRegister = new NormalViewControl(244, 100, true);
            btnRegister.Y = btnLoginByCode.Y;
            btnRegister.X = frameMidBack.Width - Application.GetRealWidth(98 + 244);
            btnRegister.TextID = R.MyInternationalizationString.Register;
            btnRegister.TextColor = UserCenterColor.Current.TextGrayColor3;
            btnRegister.TextSize = 12;
            btnRegister.TextAlignment = TextAlignment.CenterRight;
            frameMidBack.AddChidren(btnRegister);
            btnRegister.ButtonClickEvent += (sender, e) =>
            {
                var registerPage = new AccountRegister();
                CommonPage.Instance.AddChidren(registerPage);
                registerPage.Show();
            };
            //微信图标
            var btnWebChat = new IconViewControl(115);
            btnWebChat.Y = frameMidBack.Height - Application.GetRealHeight(69) - btnWebChat.IconSize;
            btnWebChat.UnSelectedImagePath = "Account/Wechat.png";
            btnWebChat.Gravity = Gravity.CenterHorizontal;
            frameMidBack.AddChidren(btnWebChat);
            btnWebChat.ButtonClickEvent += (sender, e) =>
            {
                //微信登陆
                this.LoginByWechat();
            };
            //添加服务协议控件
           // this.AddServiceAgreementControl(frameMidBack);
        }
        #endregion
@@ -1069,13 +1020,20 @@
        /// <param name="frameMidBack">中间浅色的背景容器</param>
        /// <param name="i_account">登陆账号</param>
        /// <param name="i_div">1:手机号 2:邮箱</param>
        private void InitAccoutLoginWindow(FrameLayout frameMidBack, string i_account, int i_div)
        private FrameLayout InitAccoutLoginWindow(FrameLayout frameMidBack, string i_account, int i_div)
        {
            //登陆按钮
            BottomClickButton btnLogin = null;
            //账号输入框
            TextInputControl txtAccount = null;
            //密码输入框
            TextInputControl txtPsw = null;
            //容器
            var frameBack = new FrameLayout();
            frameBack.Height = Application.GetRealHeight(620);
            frameBack.Y = Application.GetRealHeight(181);
            frameMidBack.AddChidren(frameBack);
            frameBack.Visible = false;
            //白色背景
            var frameWhiteBack = new FrameLayout();
            frameWhiteBack.Width = Application.GetRealWidth(942);
@@ -1099,7 +1057,7 @@
            btnAccountIcon.UnSelectedImagePath = "Account/Account.png";
            rowAccount.AddChidren(btnAccountIcon);
            //账号输入框
            var txtAccount = new TextInputControl(600, 92, true);
            txtAccount = new TextInputControl(600, 92, true);
            txtAccount.X = btnAccountIcon.Right + Application.GetRealWidth(35);
            txtAccount.Gravity = Gravity.CenterVertical;
            if (i_div == 1)
@@ -1116,11 +1074,42 @@
            txtAccount.PlaceholderTextColor = ZigbeeColor.Current.GXCPlaceHolderTextColor;
            txtAccount.Text = i_account;
            rowAccount.AddChidren(txtAccount);
            txtAccount.TextChangeEventHandler += (sender, e) =>
            {
                //隐藏错误提示
                if (this.btnErrorMsg.Visible == true)
                {
                    this.btnErrorMsg.Visible = false;
                }
                if (txtAccount.Text.Trim().Length > 0 && txtPsw.Text.Length > 0)
                {
                    //能够登陆
                    if (btnLogin.CanClick == false) { btnLogin.CanClick = true; }
                    return;
                }
                //不能点击
                if (btnLogin.CanClick == true) { btnLogin.CanClick = false; }
            };
            //底线
            var btnAccountLine = new NormalViewControl(rowAccount.Width, 1, false);
            btnAccountLine.BackgroundColor = ZigbeeColor.Current.GXCGrayLineColor;
            btnAccountLine.Y = rowAccount.Height - 1;
            btnAccountLine.Y = rowAccount.Height - 2;
            rowAccount.AddChidren(btnAccountLine);
            txtAccount.FoucsChanged += (sender, focusEvent) =>
            {
                //焦点进入时,底线颜色变更
                if (focusEvent.Focus)
                {
                    btnAccountLine.BackgroundColor = ZigbeeColor.Current.GXCSelectedLineColor;
                    btnAccountLine.Height = 2;
                }
                else
                {
                    btnAccountLine.BackgroundColor = ZigbeeColor.Current.GXCGrayLineColor;
                    btnAccountLine.Height = 1;
                }
            };
            //密码行
            var rowPassword = new FrameLayout();
@@ -1135,19 +1124,889 @@
            btnPswIcon.Gravity = Gravity.CenterVertical;
            btnPswIcon.UnSelectedImagePath = "Account/Password.png";
            rowPassword.AddChidren(btnPswIcon);
            //账号输入框
            var txtPsw = new TextInputControl(600, 92, true);
            //密码输入框
            txtPsw = new TextInputControl(600, 92, true);
            txtPsw.X = txtAccount.X;
            txtPsw.Gravity = Gravity.CenterVertical;
            txtPsw.PlaceholderText = Language.StringByID(R.MyInternationalizationString.PleaseInputPWD);
            txtPsw.PlaceholderTextColor = ZigbeeColor.Current.GXCPlaceHolderTextColor;
            txtPsw.SecureTextEntry = true;
            rowPassword.AddChidren(txtPsw);
            txtPsw.TextChangeEventHandler += (sender, e) =>
            {
                txtAccount.TextChangeEventHandler(sender, e);
            };
            //隐藏或者显示密码的图标
            var btnHiden = new IconViewControl(92);
            btnHiden.X = rowPassword.Width - Application.GetRealWidth(46) - btnHiden.IconSize;
            btnHiden.SelectedImagePath = "Account/UnhidePwd.png";
            btnHiden.UnSelectedImagePath = "Account/HidePwd.png";
            btnHiden.Gravity = Gravity.CenterVertical;
            rowPassword.AddChidren(btnHiden);
            btnHiden.ButtonClickEvent += (sender, e) =>
            {
                txtPsw.SecureTextEntry = !txtPsw.SecureTextEntry;
                btnHiden.IsSelected = !btnHiden.IsSelected;
            };
            //底线
            var btnPswLine = new NormalViewControl(rowPassword.Width, 1, false);
            btnPswLine.BackgroundColor = ZigbeeColor.Current.GXCGrayLineColor;
            btnPswLine.Y = rowPassword.Height - 1;
            btnPswLine.Y = rowPassword.Height - 2;
            rowPassword.AddChidren(btnPswLine);
            txtPsw.FoucsChanged += (sender, focusEvent) =>
            {
                //焦点进入时,底线颜色变更
                if (focusEvent.Focus)
                {
                    btnPswLine.BackgroundColor = ZigbeeColor.Current.GXCSelectedLineColor;
                    btnPswLine.Height = 2;
                }
                else
                {
                    btnPswLine.BackgroundColor = ZigbeeColor.Current.GXCGrayLineColor;
                    btnPswLine.Height = 1;
                }
            };
            //忘记密码?
            var btnForgot = new NormalViewControl(250, 90, true);
            btnForgot.Y = rowPassword.Bottom + Application.GetRealHeight(15);
            btnForgot.X = frameWhiteBack.Width - Application.GetRealWidth(250 + 35);
            btnForgot.TextSize = 12;
            btnForgot.TextColor = UserCenterColor.Current.TextGrayColor3;
            btnForgot.TextAlignment = TextAlignment.CenterRight;
            btnForgot.TextID = R.MyInternationalizationString.ForgotPWD_1;
            frameWhiteBack.AddChidren(btnForgot);
            btnForgot.ButtonClickEvent += (sender, e) =>
            {
                var forgot = new AccountForgetPWD();
                CommonPage.Instance.AddChidren(forgot);
                forgot.Show();
            };
            //登陆按钮
            btnLogin = new BottomClickButton(688);
            btnLogin.Gravity = Gravity.BottomCenter;
            btnLogin.TextID = R.MyInternationalizationString.Login;
            btnLogin.oldBackgroundColor = btnLogin.BackgroundColor;
            frameBack.AddChidren(btnLogin);
            btnLogin.CanClick = false;
            btnLogin.ButtonClickEvent += (sender, e) =>
            {
                //账号密码登陆
                this.LoginByAccountAndPsw(txtAccount.Text.Trim(), txtPsw.Text, i_div);
            };
            return frameBack;
        }
        #endregion
        #region ■ 初始化验证码登陆窗口_______________
        /// <summary>
        /// 初始化验证码登陆窗口
        /// </summary>
        /// <param name="frameMidBack">中间浅色的背景容器</param>
        /// <param name="i_account">登陆账号</param>
        /// <param name="i_div">1:手机号 2:邮箱</param>
        private FrameLayout InitCodeLoginWindow(FrameLayout frameMidBack, string i_account, int i_div)
        {
            //登陆按钮
            BottomClickButton btnLogin = null;
            //账号输入框
            TextInputControl txtAccount = null;
            //密码输入框
            TextInputControl txtVerCode = null;
            //当前输入的账号(防止发送验证码之后,修改账号)
            string nowInputAccount = string.Empty;
            //是否已经发送了验证码
            bool hadSendCode = false;
            //容器
            var frameBack = new FrameLayout();
            frameBack.Height = Application.GetRealHeight(620);
            frameBack.Y = Application.GetRealHeight(181);
            frameMidBack.AddChidren(frameBack);
            frameBack.Visible = false;
            //白色背景
            var frameWhiteBack = new FrameLayout();
            frameWhiteBack.Width = Application.GetRealWidth(942);
            frameWhiteBack.Height = Application.GetRealHeight(553);
            frameWhiteBack.BackgroundColor = UserCenterColor.Current.White;
            frameWhiteBack.Radius = (uint)Application.GetRealHeight(17);
            frameWhiteBack.Gravity = Gravity.CenterHorizontal;
            frameBack.AddChidren(frameWhiteBack);
            //账号行
            var rowAccount = new FrameLayout();
            rowAccount.Y = Application.GetRealHeight(29);
            rowAccount.Width = Application.GetRealWidth(884);
            rowAccount.Height = Application.GetRealHeight(138);
            rowAccount.Gravity = Gravity.CenterHorizontal;
            frameWhiteBack.AddChidren(rowAccount);
            if (i_div == 2)
            {
                //账号图标
                var btnAccountIcon = new IconViewControl(92);
                btnAccountIcon.X = Application.GetRealWidth(69);
                btnAccountIcon.Gravity = Gravity.CenterVertical;
                btnAccountIcon.UnSelectedImagePath = "Account/Account.png";
                rowAccount.AddChidren(btnAccountIcon);
            }
            else
            {
                //地区码
                var btnArea = new NormalViewControl(139, 60, true);
                btnArea.TextColor = UserCenterColor.Current.TextGrayColor1;
                btnArea.TextAlignment = TextAlignment.CenterRight;
                btnArea.Text = "+86";
                btnArea.Gravity = Gravity.CenterVertical;
                rowAccount.AddChidren(btnArea);
            }
            //账号输入框
            txtAccount = new TextInputControl(600, 92, true);
            txtAccount.X = Application.GetRealWidth(193);
            txtAccount.Gravity = Gravity.CenterVertical;
            if (i_div == 1)
            {
                //手机号
                txtAccount.IsNumberKeyboardType = true;
                txtAccount.PlaceholderText = Language.StringByID(R.MyInternationalizationString.PleaseInputPhoneNum);
            }
            else
            {
                //邮箱
                txtAccount.PlaceholderText = Language.StringByID(R.MyInternationalizationString.PleaseInputEmail);
            }
            txtAccount.PlaceholderTextColor = ZigbeeColor.Current.GXCPlaceHolderTextColor;
            txtAccount.Text = i_account;
            rowAccount.AddChidren(txtAccount);
            txtAccount.TextChangeEventHandler += (sender, e) =>
            {
                //隐藏错误提示
                if (this.btnErrorMsg.Visible == true)
                {
                    this.btnErrorMsg.Visible = false;
                }
                //必须要发送成功才行
                if (hadSendCode = true && txtAccount.Text.Trim().Length > 0 && txtVerCode.Text.Length > 0)
                {
                    //能够登陆
                    if (btnLogin.CanClick == false) { btnLogin.CanClick = true; }
                    return;
                }
                //不能点击
                if (btnLogin.CanClick == true) { btnLogin.CanClick = false; }
            };
            //底线
            var btnAccountLine = new NormalViewControl(rowAccount.Width, 1, false);
            btnAccountLine.BackgroundColor = ZigbeeColor.Current.GXCGrayLineColor;
            btnAccountLine.Y = rowAccount.Height - 2;
            rowAccount.AddChidren(btnAccountLine);
            txtAccount.FoucsChanged += (sender, focusEvent) =>
            {
                //焦点进入时,底线颜色变更
                if (focusEvent.Focus)
                {
                    btnAccountLine.BackgroundColor = ZigbeeColor.Current.GXCSelectedLineColor;
                    btnAccountLine.Height = 2;
                }
                else
                {
                    btnAccountLine.BackgroundColor = ZigbeeColor.Current.GXCGrayLineColor;
                    btnAccountLine.Height = 1;
                }
            };
            //验证码行
            var rowVerCode = new FrameLayout();
            rowVerCode.Y = rowAccount.Bottom + Application.GetRealHeight(58);
            rowVerCode.Width = rowAccount.Width;
            rowVerCode.Height = rowAccount.Height;
            rowVerCode.Gravity = Gravity.CenterHorizontal;
            frameWhiteBack.AddChidren(rowVerCode);
            //账号图标
            var btnCodeIcon = new IconViewControl(92);
            btnCodeIcon.X = Application.GetRealWidth(69);
            btnCodeIcon.Gravity = Gravity.CenterVertical;
            btnCodeIcon.UnSelectedImagePath = "Account/Code.png";
            rowVerCode.AddChidren(btnCodeIcon);
            //验证码输入框
            txtVerCode = new TextInputControl(350, 92, true);
            txtVerCode.X = btnCodeIcon.Right + Application.GetRealWidth(35);
            txtVerCode.Gravity = Gravity.CenterVertical;
            txtVerCode.PlaceholderText = Language.StringByID(R.MyInternationalizationString.PleaseInputVerificationCode);
            txtVerCode.PlaceholderTextColor = ZigbeeColor.Current.GXCPlaceHolderTextColor;
            txtVerCode.SecureTextEntry = true;
            rowVerCode.AddChidren(txtVerCode);
            txtVerCode.TextChangeEventHandler += (sender, e) =>
            {
                txtAccount.TextChangeEventHandler(sender, e);
            };
            //竖线
            var btnLine2 = new NormalViewControl(1, Application.GetRealHeight(66), false);
            btnLine2.X = Application.GetRealWidth(611);
            btnLine2.Gravity = Gravity.CenterVertical;
            btnLine2.BackgroundColor = ZigbeeColor.Current.GXCLineColor;
            rowVerCode.AddChidren(btnLine2);
            //获取验证码
            var btnSendCode = new NormalViewControl(250, 70, true);
            btnSendCode.X = btnLine2.Right + Application.GetRealWidth(36);
            btnSendCode.Gravity = Gravity.CenterVertical;
            btnSendCode.TextID = R.MyInternationalizationString.SendVerificationCode;
            btnSendCode.TextColor = UserCenterColor.Current.TextGrayColor3;
            btnSendCode.TextAlignment = TextAlignment.Center;
            btnSendCode.IsBold = true;
            rowVerCode.AddChidren(btnSendCode);
            btnSendCode.ButtonClickEvent += async (sender, e) =>
            {
                //检测输入的账号
                nowInputAccount = txtAccount.Text.Trim();
                if (this.CheckInputAccount("86", nowInputAccount, i_div) == false)
                {
                    return;
                }
                //发送验证码
                hadSendCode = await this.SendVerCode(btnSendCode, nowInputAccount, i_div);
            };
            //底线
            var btnCodeLine = new NormalViewControl(rowVerCode.Width, 1, false);
            btnCodeLine.BackgroundColor = ZigbeeColor.Current.GXCGrayLineColor;
            btnCodeLine.Y = rowVerCode.Height - 2;
            rowVerCode.AddChidren(btnCodeLine);
            txtVerCode.FoucsChanged += (sender, focusEvent) =>
            {
                //焦点进入时,底线颜色变更
                if (focusEvent.Focus)
                {
                    btnCodeLine.BackgroundColor = ZigbeeColor.Current.GXCSelectedLineColor;
                    btnCodeLine.Height = 2;
                }
                else
                {
                    btnCodeLine.BackgroundColor = ZigbeeColor.Current.GXCGrayLineColor;
                    btnCodeLine.Height = 1;
                }
            };
            //忘记密码?
            var btnForgot = new NormalViewControl(250, 90, true);
            btnForgot.Y = rowVerCode.Bottom + Application.GetRealHeight(15);
            btnForgot.X = frameWhiteBack.Width - Application.GetRealWidth(250 + 35);
            btnForgot.TextSize = 12;
            btnForgot.TextColor = UserCenterColor.Current.TextGrayColor3;
            btnForgot.TextAlignment = TextAlignment.CenterRight;
            btnForgot.TextID = R.MyInternationalizationString.ForgotPWD_1;
            frameWhiteBack.AddChidren(btnForgot);
            btnForgot.ButtonClickEvent += (sender, e) =>
            {
                var forgot = new AccountForgetPWD();
                CommonPage.Instance.AddChidren(forgot);
                forgot.Show();
            };
            //登陆按钮
            btnLogin = new BottomClickButton(688);
            btnLogin.Gravity = Gravity.BottomCenter;
            btnLogin.TextID = R.MyInternationalizationString.Login;
            btnLogin.oldBackgroundColor = btnLogin.BackgroundColor;
            frameBack.AddChidren(btnLogin);
            btnLogin.CanClick = false;
            btnLogin.ButtonClickEvent += (sender, e) =>
            {
                //验证码登陆
                this.LoginByVerCode(nowInputAccount, txtVerCode.Text.Trim(), i_div);
            };
            return frameBack;
        }
        #endregion
        #region ■ 服务协议___________________________
        /// <summary>
        /// 添加服务协议控件
        /// </summary>
        /// <param name="frameBack"></param>
        private void AddServiceAgreementControl(FrameLayout frameBack)
        {
            var frameRow = new FrameLayout();
            frameRow.Height = Application.GetMinRealAverage(110);
            frameRow.Y = Application.GetRealHeight(959);
            frameRow.Gravity = Gravity.CenterHorizontal;
            //字体总宽度
            int fontWidth = 0;
            int btnWidth = 0;
#if Android
            //特殊的误差值
            int speceilValue = Application.GetRealWidth(20);
#endif
#if iOS
            //特殊的误差值
            int speceilValue = Application.GetRealWidth(10);
#endif
            //我已阅读并同意
            var btnMsg1 = new NormalViewControl(100, 90, true);
            btnMsg1.Gravity = Gravity.CenterVertical;
            btnMsg1.Y = Application.GetRealHeight(968);
            btnMsg1.TextSize = 12;
            btnMsg1.TextColor = UserCenterColor.Current.TextGrayColor1;
            btnMsg1.TextID = R.MyInternationalizationString.uMyHadReadAndAgree;
            //计算真实宽度
            btnWidth = btnMsg1.GetRealWidthByText();
            btnMsg1.Width = btnWidth;
            fontWidth += btnWidth;
            //《隐私权政策》
            var btnMsg2 = new NormalViewControl(100, 90, true);
            btnMsg2.Gravity = Gravity.CenterVertical;
            btnMsg2.TextSize = 12;
            btnMsg2.TextColor = 0xFF4A90E2;
            btnMsg2.Text = "《" + Language.StringByID(R.MyInternationalizationString.uPrivacyPolicy) + "》";
            //计算真实宽度
            btnWidth = btnMsg2.GetRealWidthByText();
            btnMsg2.Width = btnWidth;
            fontWidth += btnWidth;
            btnMsg2.ButtonClickEvent += (sender, e) =>
            {
                var form = new UserCenter.Abount.SLAForm();
                this.AddChidren(form);
                form.InitTopFrameLayout();
                form.InitBodyFrameLayout();
                form.ShowForm();
            };
            //和
            var btnMsg3 = new NormalViewControl(100, 90, true);
            btnMsg3.Gravity = Gravity.CenterVertical;
            btnMsg3.TextSize = 12;
            btnMsg3.TextColor = UserCenterColor.Current.TextGrayColor1;
            btnMsg3.TextID = R.MyInternationalizationString.uAnd;
            //计算真实宽度
            btnWidth = btnMsg3.GetRealWidthByText();
            btnMsg3.Width = btnWidth;
            fontWidth += btnWidth;
            //《服务条款》
            var btnMsg4 = new NormalViewControl(100, 90, true);
            btnMsg4.Gravity = Gravity.CenterVertical;
            btnMsg4.TextSize = 12;
            btnMsg4.TextColor = 0xFF4A90E2;
            btnMsg4.Text = "《" + Language.StringByID(R.MyInternationalizationString.uTermsOfService) + "》";
            //计算真实宽度
            btnWidth = btnMsg4.GetRealWidthByText();
            btnMsg4.Width = btnWidth;
            fontWidth += btnWidth;
            btnMsg4.ButtonClickEvent += (sender, e) =>
            {
                btnMsg2.ButtonClickEvent(null, null);
            };
            //图标
            var btnIcon = new IconBigViewControl(42, 42);
            btnIcon.UnSelectedImagePath = "Item/Check1.png";
            btnIcon.SelectedImagePath = "Item/Check1Selected.png";
            //计算行控件的宽度
            frameRow.Width = fontWidth + Application.GetMinRealAverage(42) + Application.GetRealWidth(23) - speceilValue * 3;
            frameBack.AddChidren(frameRow);
            //图标控件初始化
            frameRow.AddChidren(btnIcon);
            btnIcon.InitControl();
            btnIcon.X = -btnIcon.XOffset;
            btnIcon.UseClickStatu = false;
            btnIcon.ButtonClickEvent += (sender, e) =>
            {
                btnIcon.IsSelected = !btnIcon.IsSelected;
                isAgreePrivacyPolicy = btnIcon.IsSelected;
            };
            btnMsg1.X = btnIcon.btnIcon.Width + Application.GetRealWidth(23);
            frameRow.AddChidren(btnMsg1);
            btnMsg2.Y = btnMsg1.Y;
            btnMsg2.X = btnMsg1.Right - speceilValue;
            frameRow.AddChidren(btnMsg2);
            btnMsg3.X = btnMsg2.Right - speceilValue;
            btnMsg3.Y = btnMsg1.Y;
            frameRow.AddChidren(btnMsg3);
            btnMsg4.X = btnMsg3.Right - speceilValue;
            btnMsg4.Y = btnMsg1.Y;
            frameRow.AddChidren(btnMsg4);
        }
        #endregion
        #region ■ 账号密码登陆_______________________
        /// <summary>
        /// 账号密码登陆
        /// </summary>
        /// <param name="i_account">账号</param>
        /// <param name="i_psw">密码</param>
        /// <param name="i_div">1:手机号 2:邮箱</param>
        private void LoginByAccountAndPsw(string i_account, string i_psw, int i_div)
        {
            //检测账号
            if (this.CheckInputAccount(string.Empty, i_account, i_div) == false)
            {
                return;
            }
            //登陆中....
            CommonPage.Loading.Start(Language.StringByID(R.MyInternationalizationString.Logining));
            HdlThreadLogic.Current.RunThread(async () =>
            {
                //登陆参数
                var pra = new SendDataToServer.LoginObj();
                pra.Account = i_account;
                pra.Password = i_psw;
                pra.Source = CommonPage.Source;
                pra.Company = CommonPage.Company;
                //访问接口
                var requestJson = Newtonsoft.Json.JsonConvert.SerializeObject(pra);
                var result = await CommonPage.Instance.RequestHttpsZigbeeAsync("ZigbeeUsers/Login", System.Text.Encoding.UTF8.GetBytes(requestJson));
                //处理登陆成功的数据
                this.AdjustLoginSuccessData(result, pra, i_account, i_psw, i_div);
            });
        }
        /// <summary>
        /// 检测输入的账号
        /// </summary>
        /// <param name="i_areaCode">地区码</param>
        /// <param name="i_account">账号</param>
        /// <param name="i_div">1:手机号 2:邮箱</param>
        /// <returns></returns>
        private bool CheckInputAccount(string i_areaCode, string i_account, int i_div)
        {
            if (i_div == 1)
            {
                //检测手机
                if (i_areaCode != string.Empty && AccountLogic.Instance.CheckPhoneWithZone(i_account, i_areaCode) == false)
                {
                    btnErrorMsg.TextID = R.MyInternationalizationString.ThePhoneError;
                    return false;
                }
                //检测手机
                if (i_areaCode == string.Empty && AccountLogic.Instance.CheckPhone(i_account) == false)
                {
                    btnErrorMsg.TextID = R.MyInternationalizationString.ThePhoneError;
                    return false;
                }
            }
            else
            {
                //检测邮箱
                if (AccountLogic.Instance.CheckEmail(i_account) == false)
                {
                    btnErrorMsg.TextID = R.MyInternationalizationString.TheEmailError;
                    return false;
                }
            }
            return true;
        }
        #endregion
        #region ■ 微信登陆___________________________
        /// <summary>
        /// 微信登录
        /// </summary>
        private void LoginByWechat()
        {
#if Android
            com.hdl.home.Application.WXLogin();
            com.hdl.home.WXEntryActivity.RespAction = (authStr) =>
            {
#endif
#if iOS
            Home.IOS.AppDelegate.WXLogin();
            Home.IOS.AppDelegate.RespAction = (authStr) =>
            {
#endif
                if (authStr == null)
                {
                    return;
                }
                HdlThreadLogic.Current.RunThread(async () =>
                {
                    //是否已经绑定
                    var re = await isBindAuthAsync(authStr);
                    if (re)
                    {
                        Application.RunOnMainThread(() =>
                        {
                            //直接登录
                            HomePage.Instance.ShowLoginLoadView();
                        });
                        var resultRegID = await Shared.Common.CommonPage.Instance.PushRegID();
                        var homes = await House.GetHomeLists();
                        //刷新个人中心的内存及线程
                        await UserCenter.UserCenterLogic.InitUserCenterMenmoryAndThread();
                        //启动ZigBee
                        ZigBee.Common.Application.Init();
                        Application.RunOnMainThread(() =>
                        {
                            this.RemoveFromParent();
                            CommonPage.Instance.RemoveViewByTag("Login");
                            UserPage.Instance.Fresh();
                        });
                    }
                    else
                    {
                        var authRes = Newtonsoft.Json.JsonConvert.DeserializeObject<Common.ResponseEntity.AuthUserRes>(authStr);
                        Application.RunOnMainThread(() =>
                        {
                            var registerPage = new AccountRegister();
                            CommonPage.Instance.AddChidren(registerPage);
                            registerPage.OpenID = authRes.openid;
                            registerPage.Show();
                        });
                    }
                });
            };
        }
        /// <summary>
        /// 是否已绑定
        /// </summary>
        /// <param name="authStr"></param>
        /// <returns></returns>
        private async System.Threading.Tasks.Task<bool> isBindAuthAsync(string authStr)
        {
            var authRes = Newtonsoft.Json.JsonConvert.DeserializeObject<Common.ResponseEntity.AuthUserRes>(authStr);
            var auth = new SendDataToServer.AuthUser()
            {
                AccessToken = authRes.access_token,
                RefreshToken = authRes.refresh_token,
                OpenID = authRes.openid
            };
            //获取微信昵称
            var strUrl = "https://api.weixin.qq.com/sns/userinfo?access_token=" + authRes.access_token;
            strUrl += "&openid=" + authRes.openid;
            var byteData = await Common.CommonPage.Instance.DoRequestZigbeeHttpsInterface(strUrl, null, null, "GET");
            if (byteData == null)
            {
                return false;
            }
            var receipData = System.Text.Encoding.UTF8.GetString(byteData);
            var nickData = Newtonsoft.Json.JsonConvert.DeserializeObject<UserCenter.NicknameInfo>(receipData);
            auth.UserName = nickData.nickname;
            var requestJson = Newtonsoft.Json.JsonConvert.SerializeObject(auth);
            var revertObj = await CommonPage.Instance.RequestHttpsZigbeeAsync("ZigbeeUsers/InsertOrUpdateAuthUser", System.Text.Encoding.UTF8.GetBytes(requestJson));
            if (revertObj == null)
            {
                return false;
            }
            var stateCodeStr = revertObj.StateCode.ToUpper();
            if (stateCodeStr == "SUCCESS")
            {
                var responseDataObj = Newtonsoft.Json.JsonConvert.DeserializeObject<Shared.Common.ResponseEntity.UserLoginRes>(revertObj.ResponseData.ToString());
                var revertData = responseDataObj;
                //标记上一次是不是同一个账号登陆
                UserCenter.UserCenterResourse.ResidenceOption.TheSameLoginAccount = Config.Instance.Guid == revertData.Guid;
                Config.Instance.Account = revertData.Account;
                Config.Instance.MD5PWD = revertData.MD5PWD;
                Config.Instance.Guid = revertData.Guid;
                Config.Instance.LoginDateTime = DateTime.Now;
                Config.Instance.Save();
                return true;
            }
            else
            {
                return false;
            }
        }
        #endregion
        #region ■ 验证码登陆_________________________
        /// <summary>
        /// 验证码登陆
        /// </summary>
        /// <param name="i_account">账号</param>
        /// <param name="i_verCode">验证码</param>
        /// <param name="i_div">1:手机号 2:邮箱</param>
        private async void LoginByVerCode(string i_account, string i_verCode, int i_div)
        {
            var pra = new SendDataToServer.LoginValidCodeOBJ()
            {
                Account = i_account,
                Code = i_verCode,
                Language = CommonPage.ZigBeeLanguage,
                AreaCode = int.Parse(CommonPage.PhoneZoneStr)
            };
            var result = await CommonFormResouce.LoginByCode(pra);
            //处理登陆成功的数据
            this.AdjustLoginSuccessData(result, pra, i_account, string.Empty, i_div);
        }
        /// <summary>
        /// 发送验证码
        /// </summary>
        /// <param name="btnSendCode">发送按钮</param>
        /// <param name="account">账号</param>
        /// <param name="i_div">1:手机号 2:邮箱</param>
        /// <returns></returns>
        private async System.Threading.Tasks.Task<bool> SendVerCode(NormalViewControl btnSendCode, string account, int i_div)
        {
            //不能再点击
            btnSendCode.CanClick = false;
            int companyInt = 0;
            if (CommonPage.PhoneZoneStr == "86" || i_div == 2)
            {
                companyInt = CommonPage.Company;
            }
            else
            {
                companyInt = CommonPage.CompanyForINTERNETION;
            }
            var reqDtoSignPhone = new SendDataToServer.LoginSendVerCodeObj()
            {
                Account = account,
                Company = companyInt,
                AreaCode = int.Parse(CommonPage.PhoneZoneStr),
                Language = CommonPage.ZigBeeLanguage
            };
            var requestRevertObj = await CommonFormResouce.LoginSendVerCode(reqDtoSignPhone);
            if (requestRevertObj == null)
            {
                //请求服务器失败
                CommonPage.Instance.FailureToServer();
                return false;
            }
            var stateCodeStr = requestRevertObj.StateCode.ToUpper();
            if (stateCodeStr == "SUCCESS")
            {
                //开启发送验证码的倒计时
                this.StartSendVerCodeTimeOutThread(btnSendCode);
                return true;
            }
            if (stateCodeStr == "PARAMETEROREMPTY")
            {
                //提供的参数错误
                btnErrorMsg.TextID = R.MyInternationalizationString.PARAMETEROREMPTY;
            }
            else if (stateCodeStr == "ACCOUNTNOEXISTS")
            {
                //账号不存在
                btnErrorMsg.TextID = R.MyInternationalizationString.ACCOUNTNOEXISTS;
            }
            else if (stateCodeStr == "SENDFAIL")
            {
                //验证码发送失败
                btnErrorMsg.TextID = R.MyInternationalizationString.SENDFAIL;
            }
            else
            {
                //请求服务器失败
                btnErrorMsg.TextID = R.MyInternationalizationString.RequestServerFailed;
                //写Log
                IMessageCommon.Current.GetMsgByRequestName("ZigbeeUsers/LoginSendVerCode", requestRevertObj, reqDtoSignPhone);
            }
            HdlThreadLogic.Current.RunThread(() =>
            {
                //发送失败后,5秒之后才能再次发送
                int i = 0;
                while (i <= 5)
                {
                    i++;
                    System.Threading.Thread.Sleep(1000);
                }
                btnSendCode.CanClick = true;
            });
            return false;
        }
        /// <summary>
        /// 开启发送验证码的倒计时
        /// </summary>
        /// <param name="btnSendCode"></param>
        private void StartSendVerCodeTimeOutThread(NormalViewControl btnSendCode)
        {
            HdlThreadLogic.Current.RunThread(() =>
            {
                //后重发
                string strText = Language.StringByID(R.MyInternationalizationString.SendVerificationCodeAgain);
                int time = 60;
                while (time > 0 && btnSendCode.Parent != null)
                {
                    HdlThreadLogic.Current.RunMain(() =>
                    {
                        btnSendCode.Text = time + "s" + strText;
                    });
                    time--;
                }
                //倒计时完成之后,可以再次点击
                btnSendCode.CanClick = true;
                btnSendCode.TextID = R.MyInternationalizationString.SendVerificationCode;//获取验证码
            });
        }
        #endregion
        #region ■ 处理登陆成功的数据_________________
        /// <summary>
        /// 处理登陆成功的数据
        /// </summary>
        /// <param name="revertObj">云端返回的数据</param>
        /// <param name="pra">接口请求参数</param>
        /// <param name="i_account">账号</param>
        /// <param name="i_psw">密码,验证码登陆时,设置为 string.Empty</param>
        /// <param name="i_div">1:手机号 2:邮箱</param>
        private async void AdjustLoginSuccessData(Common.ResponseEntity.ResponsePack revertObj, object pra,
            string i_account, string i_psw, int i_div)
        {
            if (revertObj == null)
            {
                HdlThreadLogic.Current.RunMain(() =>
                {
                    //请求服务器失败
                    CommonPage.Instance.FailureToServer();
                    CommonPage.Loading.Hide();
                });
                return;
            }
            var stateCodeStr = revertObj.StateCode.ToUpper();
            //Error 不能直接从服务器取,只能根据状态码逐一判断
            if (stateCodeStr == "SUCCESS")
            {
                HdlThreadLogic.Current.RunMain(() =>
                {
                    //显示启动页
                    HomePage.Instance.ShowLoginLoadView();
                });
                //存储数据
                var responseDataObj = Newtonsoft.Json.JsonConvert.DeserializeObject<Shared.Common.ResponseEntity.UserLoginRes>(revertObj.ResponseData.ToString());
                var revertData = responseDataObj;
                Config.ReFresh();
                //标记上一次是不是同一个账号登陆
                UserCenterResourse.ResidenceOption.TheSameLoginAccount = Config.Instance.Guid == revertData.Guid;
                Config.Instance.Account = revertData.Account;
                Config.Instance.Password = i_psw;
                Config.Instance.MD5PWD = revertData.MD5PWD;
                Config.Instance.Guid = revertData.Guid;
                Config.Instance.LoginDateTime = DateTime.Now;
                Config.Instance.LoginToken = revertData.Token;
                Config.Instance.Save();
                var resultRegID = await CommonPage.Instance.PushRegID();
                var homes = await House.GetHomeLists();
                //刷新个人中心的内存及线程
                await UserCenterLogic.InitUserCenterMenmoryAndThread();
                //启动ZigBee
                ZigBee.Common.Application.Init();
                HdlThreadLogic.Current.RunMain(() =>
                {
                    CommonPage.Loading.Hide();
                    this.RemoveFromParent();
                    CommonPage.Instance.RemoveViewByTag("Login");
                    UserPage.Instance.Fresh();
                });
                return;
            }
            //关闭转圈的
            HdlThreadLogic.Current.RunMain(() =>
            {
                CommonPage.Loading.Hide();
                if (stateCodeStr == "NOTVERIFY")
                {
                    //未激活
                    btnErrorMsg.TextID = R.MyInternationalizationString.NOTVERIFY;
                }
                else if (stateCodeStr == "NOTENABLE")
                {
                    //该用户属于调试账号,并未启用
                    btnErrorMsg.TextID = R.MyInternationalizationString.NOTENABLE;
                }
                else if (stateCodeStr == "PARAMETEROREMPTY")
                {
                    //提供的参数错误
                    btnErrorMsg.TextID = R.MyInternationalizationString.PARAMETEROREMPTY;
                }
                else if (stateCodeStr == "VALIDCODEANDPHONENOEQUAL")
                {
                    //验证码错误,请重新输入
                    btnErrorMsg.TextID = R.MyInternationalizationString.VALIDCODEANDPHONENOEQUAL;
                }
                else if (stateCodeStr == "USERNAMEORPWDERROR")
                {
                    //账号或密码错误
                    btnErrorMsg.TextID = R.MyInternationalizationString.USERNAMEORPWDERROR;
                }
                else if (stateCodeStr == "ACCOUNTNOEXISTS")
                {
                    //账号不存在
                    btnErrorMsg.TextID = R.MyInternationalizationString.ACCOUNTNOEXISTS;
                }
                else if (stateCodeStr == "NORECORD" && i_psw == string.Empty)
                {
                    //请先获取验证码
                    btnErrorMsg.TextID = R.MyInternationalizationString.NORECORD;
                }
                else if (stateCodeStr == "YOUDATANOISLOCALREGION")
                {
                    //不在本区域,需要重定向区域后再次请求登录
                    var responseDataObj = Newtonsoft.Json.JsonConvert.DeserializeObject<Shared.Common.ResponseEntity.UserLoginLocalRegionRes>(revertObj.ResponseData.ToString());
                    CommonPage.RequestHttpsHost = responseDataObj.RegionServer;
                    if (i_psw != string.Empty)
                    {
                        //再次登录
                        this.LoginByAccountAndPsw(i_account, i_psw, i_div);
                    }
                }
                else
                {
                    btnErrorMsg.TextID = R.MyInternationalizationString.RequestServerFailed;
                    //写Log
                    if (pra is SendDataToServer.LoginObj)
                    {
                        ((SendDataToServer.LoginObj)pra).Password = "*********";
                        IMessageCommon.Current.GetMsgByRequestName("ZigbeeUsers/Login", revertObj, pra);
                    }
                    else
                    {
                        IMessageCommon.Current.GetMsgByRequestName("ZigbeeUsers/LoginValidCode", revertObj, pra);
                    }
                }
            });
        }
        #endregion
        #region ■ 一般方法___________________________
        /// <summary>
        /// 检测隐私协议
        /// </summary>
        /// <returns></returns>
        private bool CheckPrivacyPolicy()
        {
            if (isAgreePrivacyPolicy == false)
            {
                //请先阅读并同意《隐私权政策》和《服务条款》
                var btnMsg = new ShowMsgControl(ShowMsgType.Remind, Language.StringByID(R.MyInternationalizationString.uPleaseReadAndAgreePrivacyPolicyMsg));
                btnMsg.Show();
                return false;
            }
            return true;
        }
        #endregion