WJC
2020-03-23 bba578c2f0acf2eca747edcb69426771e0cadd32
ZigbeeApp/Shared/Phone/UserCenter/DoorLock/TimeSettignPage.cs
@@ -7,6 +7,7 @@
{
    public class TimeSettignPage : DoorLockCommonLayout, ZigBee.Common.IStatus
    {
        #region 上报数据处理
        /// <summary>
        /// 处理变化事件
        /// </summary>
@@ -47,7 +48,9 @@
                }
            }
        }
        #endregion
        #region 构造函数
        /// <summary>
        /// 构造函数
        /// </summary>
@@ -59,7 +62,9 @@
            BackgroundColor = Shared.Common.ZigbeeColor.Current.GXCTopViewBackgroundColor;
            ZigBee.Device.ZbGateway.StatusList.Add(this);
        }
        #endregion
        #region UI内容
        #region  变量申明
        /// <summary>
        /// 当前门锁
@@ -116,15 +121,6 @@
        #endregion
        /// <summary>
        /// 重写移除方法
        /// </summary>
        public override void RemoveFromParent()
        {
            ZbGateway.StatusList.Remove(this);
            base.RemoveFromParent();
        }
        /// <summary>
        /// UI显示 
        /// </summary>
        public void Show()
@@ -151,6 +147,7 @@
            this.MidFrameLayout(this);
            MidFrameLayoutContent();
        }
        /// <summary>
        /// 中部布局
        /// </summary>
@@ -158,34 +155,30 @@
        {
            if (setTimeType == "DoorLockTime")
            {
                CommonPage.Loading.Start("");
                // 只有重新启动时会慢,然后其他时刻都是有值的
                new System.Threading.Thread(() =>
                {
                    while (this.Parent != null)
                    {
                        if (DateTime.Now > waitGetDoorLockTime)
                        {
                            Application.RunOnMainThread(() =>
                            {
                                new Tip() { MaxWidth = 150, Text = Language.StringByID(R.MyInternationalizationString.GwResponseOvertime), Direction = AMPopTipDirection.None, CloseTime = 2 }.Show(CommonPage.Instance);
                                CommonPage.Loading.Hide();
                            });
                        }
                        //读门锁时间
                        //等待10秒,没有收到提示超时退出
                        waitGetDoorLockTime = DateTime.Now.AddSeconds(+5);
                        doorLock.ReadAttri(ZigBee.Device.Cluster_ID.DoorLock, ZigBee.Device.AttriButeId.DoorLock);
                        System.Threading.Thread.Sleep(5 * 1000);
                    }
                })
                { IsBackground = true }.Start();
                ReadDoorlockTime();
            }
            var MidTopFrameLayout = new FrameLayout()
            var zoneFrameLayout = new FrameLayout()
            {
                BackgroundColor = Shared.Common.ZigbeeColor.Current.XMWhite,
            };
            this.midFrameLayout.AddChidren(MidTopFrameLayout);
            this.midFrameLayout.AddChidren(zoneFrameLayout);
            if (setTimeType == "DoorLockTime")
            {
                zoneFrameLayout.Height = Application.GetRealHeight(150) + 1;
                AddDoorLocksTimeRow(zoneFrameLayout);
            }
            else
            {
                zoneFrameLayout.Height = Application.GetRealHeight(0);
            }
            var midTopFrameLayout = new FrameLayout()
            {
                Y = zoneFrameLayout.Bottom,
            };
            this.midFrameLayout.AddChidren(midTopFrameLayout);
            var dtNow = DateTime.Now;
            for (int i = 0; i < 2; i++)
@@ -196,7 +189,7 @@
                    Height = Application.GetRealHeight(127 + 23),
                    BackgroundColor = Shared.Common.ZigbeeColor.Current.XMWhite,
                };
                MidTopFrameLayout.AddChidren(rowLayout);
                midTopFrameLayout.AddChidren(rowLayout);
                var btnDateTime = new Button()
                {
@@ -241,7 +234,7 @@
                    X = Application.GetRealWidth(58),
                    BackgroundColor = Shared.Common.ZigbeeColor.Current.XMRowLine,
                };
                MidTopFrameLayout.AddChidren(btnLine);
                midTopFrameLayout.AddChidren(btnLine);
                #endregion
                #region 显示处理
@@ -328,6 +321,290 @@
                int curIndex = i;
                EventHandler<MouseEventArgs> hander = (sender, e) =>
                {
                    ClickHandle(curIndex, dtNow);
                };
                rowLayout.MouseDownEventHandler += hander;
                btnDateTime.MouseDownEventHandler += hander;
                textDisplayDateFrameLayout.MouseDownEventHandler += hander;
                btnNextFrameLayout.MouseDownEventHandler += hander;
                btnNext.MouseDownEventHandler += hander;
                if (curIndex == 0)
                {
                    textDisplayDate.MouseDownEventHandler += hander;
                }
                else
                {
                    textDisplayTime.MouseDownEventHandler += hander;
                }
                #endregion
            }
            btnCancel.MouseUpEventHandler += (sender1, e1) =>
            {
                this.shadowRadiusFrameLayout.RemoveFromParent();
            };
            btnFinish.MouseUpEventHandler += (sender1, e1) =>
            {
                if (setTimeType == "DoorLockTime")
                {
                    DoorLockTimeFinishHandle();
                }
            };
            this.shadowRadiusFrameLayout.MouseUpEventHandler += (sender1, e1) =>
            {
                this.shadowRadiusFrameLayout.RemoveFromParent();
            };
            if (setTimeType == "DoorLockTime")
            {
                if (CurentDoorLockTime != null && CurentDoorLockTime.Year != 1)
                {
                    waitGetDoorLockTime = DateTime.MaxValue;
                    CommonPage.Loading.Hide();
                }
            }
        }
        #endregion
        #region 时区
        /// <summary>
        /// 添加【门锁时间】行(门锁专用)
        /// </summary>
        private void AddDoorLocksTimeRow(FrameLayout zoneFrameLayout)
        {
            //门锁时间
            var rowLayout = new FrameLayout()
            {
                Height = Application.GetRealHeight(150),
                BackgroundColor = Shared.Common.ZigbeeColor.Current.XMWhite,
            };
            zoneFrameLayout.AddChidren(rowLayout);
            //当前时区
            var btnCurZone = new Button()
            {
                Width = Application.GetRealWidth(560),
                Height = Application.GetRealHeight(58),
                X = Application.GetRealWidth(58),
                TextColor = Shared.Common.ZigbeeColor.Current.XMBlack,
                TextAlignment = TextAlignment.CenterLeft,
                TextSize = 12,
                Y = Application.GetRealHeight(46),
                Text = Language.StringByID(R.MyInternationalizationString.CurZone),
            };
            rowLayout.AddChidren(btnCurZone);
            //哪个时区
            var textZone = new Button()
            {
                Width = Application.GetRealWidth(333),
                Height = Application.GetRealHeight(58),
                X = Application.GetRealWidth(689),
                Y = Application.GetRealHeight(46),
                TextAlignment = TextAlignment.CenterRight,
                TextColor = Shared.Common.ZigbeeColor.Current.XMGray4,
                TextSize = 14,
            };
            rowLayout.AddChidren(textZone);
            textZone.Text = zoneData();
            textZone.MouseDownEventHandler += (sender, e) =>
            {
                GetSpecificZoneNowDate();
            };
            var btnLine = new FrameLayout()
            {
                Width = Application.GetRealWidth(965),
                Height = 1,
                X = Application.GetRealWidth(58),
                Y = Application.GetRealHeight(150),
                BackgroundColor = Shared.Common.ZigbeeColor.Current.XMRowLine,
            };
            zoneFrameLayout.AddChidren(btnLine);
        }
        /// <summary>
        /// 时区数据
        /// </summary>
        /// <returns></returns>
        private string zoneData()
        {
            string zoneText = "";
            var gwZone = caculateTimeZone(Common.Config.Instance.Home.Longitude);
            if (gwZone.Contains('+'))
            {
                zoneText = Language.StringByID(R.MyInternationalizationString.East);
            }
            else
            {
                zoneText = Language.StringByID(R.MyInternationalizationString.West);
            }
            var num = ToNum(int.Parse(gwZone));
            return zoneText += num + Language.StringByID(R.MyInternationalizationString.CurZoneText);
        }
        /// <summary>
        /// 获取时区
        /// <para>currentLon:"+"为东区,“-”为西区</para>
        /// </summary>
        public static String caculateTimeZone(double currentLon)
        {
            int timeZone;
            int shangValue = (int)(currentLon / 15);
            double yushuValue = Math.Abs(currentLon % 15);
            if (yushuValue <= 7.5)
            {
                timeZone = shangValue;
            }
            else
            {
                timeZone = shangValue + (currentLon > 0 ? 1 : -1);
            }
            return timeZone >= 0 ? "+" + Math.Abs(timeZone) : "-" + Math.Abs(timeZone);
        }
        /// <summary>
        /// 转换数字
        /// </summary>
        private string ToNum(int x)
        {
            var numString = new string[] { "零", "一", "二", "三", "四", "五", "六", "七", "八", "九", "十", "十一", "十二" };
            var strChnNamesList = new List<string>(numString);
            return strChnNamesList[x];
        }
        //如何显示时区所在的时间
        public DateTime GetSpecificZoneNowDate(string zoneName = "")
        {
            DateTime curZoneDateTime;
            // 列举所有支持的时区列表
            System.Collections.ObjectModel.ReadOnlyCollection<TimeZoneInfo> lst = TimeZoneInfo.GetSystemTimeZones();
            foreach (TimeZoneInfo tzi in lst)
            {
                var aa = tzi;
                var aa1 = tzi.Id;
            }
            GetSpecificZoneNowDate1();
            zoneName = "Central America Standard Time";//美国
            //将本地时间转换为美国标准中部时间
            DateTime dt = TimeZoneInfo.ConvertTimeToUtc(DateTime.Now, TimeZoneInfo.Local);
            curZoneDateTime = TimeZoneInfo.ConvertTimeFromUtc(dt, TimeZoneInfo.FindSystemTimeZoneById(zoneName));
            zoneName = "China Standard Time";//中国
            //首先将服务器的时间转化为utc时间,
            var utcdate = DateTime.Now.ToUniversalTime();
            //然后转换成指定时区的日期
            TimeZoneInfo beiJingZone = TimeZoneInfo.FindSystemTimeZoneById(zoneName);
            curZoneDateTime = TimeZoneInfo.ConvertTimeFromUtc(utcdate, beiJingZone);
            return curZoneDateTime;
        }
        public void GetSpecificZoneNowDate1()
        {
            // Get time in local time zone
            DateTime thisTime = DateTime.Now;
            Console.WriteLine("Time in {0} zone: {1}", TimeZoneInfo.Local.IsDaylightSavingTime(thisTime) ?
                              TimeZoneInfo.Local.DaylightName : TimeZoneInfo.Local.StandardName, thisTime);
            Console.WriteLine("   UTC Time: {0}", TimeZoneInfo.ConvertTimeToUtc(thisTime, TimeZoneInfo.Local));
            // Get Tokyo Standard Time zone
            TimeZoneInfo tst = TimeZoneInfo.FindSystemTimeZoneById("Tokyo Standard Time");
            DateTime tstTime = TimeZoneInfo.ConvertTime(thisTime, TimeZoneInfo.Local, tst);
            Console.WriteLine("Time in {0} zone: {1}", TimeZoneInfo.Local.IsDaylightSavingTime(tstTime) ?
                              tst.DaylightName : tst.StandardName, tstTime);
            Console.WriteLine("   UTC Time: {0}", TimeZoneInfo.ConvertTimeToUtc(tstTime, tst));
        }
        #endregion
        #region 门锁时间
        /// <summary>
        /// 读取门锁时间
        /// </summary>
        private void ReadDoorlockTime()
        {
            CommonPage.Loading.Start("");
            // 只有重新启动时会慢,然后其他时刻都是有值的
            new System.Threading.Thread(() =>
            {
                while (this.Parent != null)
                {
                    if (DateTime.Now > waitGetDoorLockTime)
                    {
                        Application.RunOnMainThread(() =>
                        {
                            new Tip() { MaxWidth = 150, Text = Language.StringByID(R.MyInternationalizationString.GwResponseOvertime), Direction = AMPopTipDirection.None, CloseTime = 2 }.Show(CommonPage.Instance);
                            CommonPage.Loading.Hide();
                        });
                    }
                    //读门锁时间
                    //等待10秒,没有收到提示超时退出
                    waitGetDoorLockTime = DateTime.Now.AddSeconds(+5);
                    doorLock.ReadAttri(ZigBee.Device.Cluster_ID.DoorLock, ZigBee.Device.AttriButeId.DoorLock);
                    System.Threading.Thread.Sleep(5 * 1000);
                }
            })
            { IsBackground = true }.Start();
        }
        /// <summary>
        /// 门锁时间确认按钮处理
        /// </summary>
        private void DoorLockTimeFinishHandle()
        {
            System.Threading.Tasks.Task.Run(async () =>
            {
                try
                {
                    var curDateTime = new DateTime(curYear, curMonth, curDay, curHour, curMin, curSec);
                    var setTimestamp = Shared.Phone.UserCenter.DoorLock.DoorLockCommonInfo.GetUnixTimeStamp(curDateTime);
                    Application.RunOnMainThread(() =>
                    {
                        CommonPage.Loading.Start("");
                    });
                    var rectifyResult = await doorLock.RectifyDoorLockTimeAsync(int.Parse(setTimestamp));
                    if (rectifyResult != null && rectifyResult.setWritableValueResponData != null)
                    {
                        Application.RunOnMainThread(() =>
                        {
                            if (rectifyResult.setWritableValueResponData.Status == 0)
                            {
                                doorLock.ReadAttri(ZigBee.Device.Cluster_ID.DoorLock, ZigBee.Device.AttriButeId.DoorLock);
                                System.Threading.Thread.Sleep(1000);
                                this.shadowRadiusFrameLayout.RemoveFromParent();
                            }
                            else
                            {
                                new Tip() { MaxWidth = 150, Text = Language.StringByID(R.MyInternationalizationString.RectifyFailed), Direction = AMPopTipDirection.Up, CloseTime = 1 }.Show(btnFinish);
                            }
                        });
                    }
                    else
                    {
                        Application.RunOnMainThread(() =>
                        {
                            new Tip() { MaxWidth = 150, Text = Language.StringByID(R.MyInternationalizationString.GwResponseOvertime), Direction = AMPopTipDirection.Up, CloseTime = 1 }.Show(btnFinish);
                        });
                    }
                }
                catch { }
                finally
                {
                    Application.RunOnMainThread(() => { CommonPage.Loading.Hide(); });
                }
            });
        }
        #endregion
        #region 公共事件处理
        /// <summary>
        /// 事件处理
        /// </summary>
        private void ClickHandle(int curIndex, DateTime dtNow)
        {
                    this.midFrameLayout.AddChidren(this.shadowRadiusFrameLayout);
                    this.bottomRadiusFrameLayout.RemoveAll();
                    this.BottomRadiusFrameLayout(this);
@@ -395,15 +672,15 @@
                            if (setTimeType == "ValidTime")
                            {
                                Shared.Phone.UserCenter.DoorLock.DoorLockCommonInfo.ValidDateYear = dtNow.Year;
                                Shared.Phone.UserCenter.DoorLock.DoorLockCommonInfo.ValidDateMonth = curMonth;
                                Shared.Phone.UserCenter.DoorLock.DoorLockCommonInfo.ValidDateDay = curDay;
                        DoorLockCommonInfo.ValidDateYear = dtNow.Year;
                        DoorLockCommonInfo.ValidDateMonth = curMonth;
                        DoorLockCommonInfo.ValidDateDay = curDay;
                            }
                            else
                            {
                                Shared.Phone.UserCenter.DoorLock.DoorLockCommonInfo.InValidDateYear = dtNow.Year;
                                Shared.Phone.UserCenter.DoorLock.DoorLockCommonInfo.InValidDateMonth = curMonth;
                                Shared.Phone.UserCenter.DoorLock.DoorLockCommonInfo.InValidDateDay = curDay;
                        DoorLockCommonInfo.InValidDateYear = dtNow.Year;
                        DoorLockCommonInfo.InValidDateMonth = curMonth;
                        DoorLockCommonInfo.InValidDateDay = curDay;
                            }
                            var btnOk = new Button
                            {
@@ -420,15 +697,15 @@
                            {
                                if (setTimeType == "ValidTime")
                                {
                                    Shared.Phone.UserCenter.DoorLock.DoorLockCommonInfo.ValidDateYear = dtNow.Year;
                                    Shared.Phone.UserCenter.DoorLock.DoorLockCommonInfo.ValidDateMonth = curMonth;
                                    Shared.Phone.UserCenter.DoorLock.DoorLockCommonInfo.ValidDateDay = curDay;
                            DoorLockCommonInfo.ValidDateYear = dtNow.Year;
                            DoorLockCommonInfo.ValidDateMonth = curMonth;
                            DoorLockCommonInfo.ValidDateDay = curDay;
                                }
                                else
                                {
                                    Shared.Phone.UserCenter.DoorLock.DoorLockCommonInfo.InValidDateYear = dtNow.Year;
                                    Shared.Phone.UserCenter.DoorLock.DoorLockCommonInfo.InValidDateMonth = curMonth;
                                    Shared.Phone.UserCenter.DoorLock.DoorLockCommonInfo.InValidDateDay = curDay;
                            DoorLockCommonInfo.InValidDateYear = dtNow.Year;
                            DoorLockCommonInfo.InValidDateMonth = curMonth;
                            DoorLockCommonInfo.InValidDateDay = curDay;
                                }
                                if (timeSetAction != null)
                                {
@@ -571,15 +848,15 @@
                        if (setTimeType == "ValidTime")
                        {
                            Shared.Phone.UserCenter.DoorLock.DoorLockCommonInfo.ValidDateHour = curHour;
                            Shared.Phone.UserCenter.DoorLock.DoorLockCommonInfo.ValidDateMinute = curMin;
                            Shared.Phone.UserCenter.DoorLock.DoorLockCommonInfo.ValidDateSecond = curSec;
                    DoorLockCommonInfo.ValidDateHour = curHour;
                    DoorLockCommonInfo.ValidDateMinute = curMin;
                    DoorLockCommonInfo.ValidDateSecond = curSec;
                        }
                        else
                        {
                            Shared.Phone.UserCenter.DoorLock.DoorLockCommonInfo.InValidDateHour = curHour;
                            Shared.Phone.UserCenter.DoorLock.DoorLockCommonInfo.InValidDateMinute = curMin;
                            Shared.Phone.UserCenter.DoorLock.DoorLockCommonInfo.InValidDateSecond = curSec;
                    DoorLockCommonInfo.InValidDateHour = curHour;
                    DoorLockCommonInfo.InValidDateMinute = curMin;
                    DoorLockCommonInfo.InValidDateSecond = curSec;
                        }
                        if (setTimeType != "DoorLockTime")
@@ -599,15 +876,15 @@
                            {
                                if (setTimeType == "ValidTime")
                                {
                                    Shared.Phone.UserCenter.DoorLock.DoorLockCommonInfo.ValidDateHour = curHour;
                                    Shared.Phone.UserCenter.DoorLock.DoorLockCommonInfo.ValidDateMinute = curMin;
                                    Shared.Phone.UserCenter.DoorLock.DoorLockCommonInfo.ValidDateSecond = curSec;
                            DoorLockCommonInfo.ValidDateHour = curHour;
                            DoorLockCommonInfo.ValidDateMinute = curMin;
                            DoorLockCommonInfo.ValidDateSecond = curSec;
                                }
                                else
                                {
                                    Shared.Phone.UserCenter.DoorLock.DoorLockCommonInfo.InValidDateHour = curHour;
                                    Shared.Phone.UserCenter.DoorLock.DoorLockCommonInfo.InValidDateMinute = curMin;
                                    Shared.Phone.UserCenter.DoorLock.DoorLockCommonInfo.InValidDateSecond = curSec;
                            DoorLockCommonInfo.InValidDateHour = curHour;
                            DoorLockCommonInfo.InValidDateMinute = curMin;
                            DoorLockCommonInfo.InValidDateSecond = curSec;
                                }
                                if (timeSetAction != null)
                                {
@@ -618,109 +895,17 @@
                            };
                        }
                    }
                };
                rowLayout.MouseDownEventHandler += hander;
                btnDateTime.MouseDownEventHandler += hander;
                textDisplayDateFrameLayout.MouseDownEventHandler += hander;
                btnNextFrameLayout.MouseDownEventHandler += hander;
                btnNext.MouseDownEventHandler += hander;
                if (curIndex == 0)
                {
                    textDisplayDate.MouseDownEventHandler += hander;
                }
                else
                {
                    textDisplayTime.MouseDownEventHandler += hander;
                }
                #endregion 
            }
            btnCancel.MouseUpEventHandler += (sender1, e1) =>
            {
                this.shadowRadiusFrameLayout.RemoveFromParent();
            };
            btnFinish.MouseUpEventHandler +=  (sender1, e1) =>
            {
                if (setTimeType == "DoorLockTime")
                {
                    System.Threading.Tasks.Task.Run(async () => {
                        try
                        {
                            var curDateTime = new DateTime(curYear, curMonth, curDay, curHour, curMin, curSec);
                            var setTimestamp = Shared.Phone.UserCenter.DoorLock.DoorLockCommonInfo.GetUnixTimeStamp(curDateTime);
                            Application.RunOnMainThread(() => {
                                CommonPage.Loading.Start("");
                            });
                            var rectifyResult = await doorLock.RectifyDoorLockTimeAsync(int.Parse(setTimestamp));
                            if (rectifyResult != null && rectifyResult.setWritableValueResponData != null)
                            {
                                Application.RunOnMainThread(() => {
                                    if (rectifyResult.setWritableValueResponData.Status == 0)
                                    {
                                        doorLock.ReadAttri(ZigBee.Device.Cluster_ID.DoorLock, ZigBee.Device.AttriButeId.DoorLock);
                                        System.Threading.Thread.Sleep(1000);
                                        this.shadowRadiusFrameLayout.RemoveFromParent();
                                    }
                                    else
                                    {
                                        new Tip() { MaxWidth = 150, Text = Language.StringByID(R.MyInternationalizationString.RectifyFailed), Direction = AMPopTipDirection.Up, CloseTime = 1 }.Show(btnFinish);
                                    }
                                });
                            }
                            else
                            {
                                Application.RunOnMainThread(() => {
                                    new Tip() { MaxWidth = 150, Text = Language.StringByID(R.MyInternationalizationString.GwResponseOvertime), Direction = AMPopTipDirection.Up, CloseTime = 1 }.Show(btnFinish);
                                });
                            }
                        }
                        catch { }
                        finally
                        {
                            Application.RunOnMainThread(() => { CommonPage.Loading.Hide(); });
                        }
                    });
                }
            };
            this.shadowRadiusFrameLayout.MouseUpEventHandler += (sender1, e1) =>
            {
                this.shadowRadiusFrameLayout.RemoveFromParent();
            };
            if (setTimeType == "DoorLockTime")
            {
                if (CurentDoorLockTime != null && CurentDoorLockTime.Year != 1)
                {
                    waitGetDoorLockTime = DateTime.MaxValue;
                    CommonPage.Loading.Hide();
                }
            }
        }
        #region  接口实现
        #region 移除方法
        /// <summary>
        /// 处理变化事件 --将弃用 改用DeviceInfoChange()
        /// 重写移除方法
        /// </summary>
        /// <returns>The changed.</returns>
        /// <param name="common">Common.</param>
        public void Changed(CommonDevice common)
        public override void RemoveFromParent()
        {
        }
        /// <summary>
        /// Changeds the IL ogic status.
        /// </summary>
        /// <param name="logic">Logic.</param>
        public void ChangedILogicStatus(ZigBee.Device.Logic logic)
        {
        }
        /// <summary>
        /// Changeds the IS cene status.
        /// </summary>
        /// <param name="scene">Scene.</param>
        public void ChangedISceneStatus(Scene scene)
        {
            ZbGateway.StatusList.Remove(this);
            base.RemoveFromParent();
        }
        #endregion
    }