From 6fa9d69da922c8049f5acfcbb9ce9fd26811024c Mon Sep 17 00:00:00 2001
From: xm <1271024303@qq.com>
Date: 星期四, 16 四月 2020 17:10:57 +0800
Subject: [PATCH] 请合并代码

---
 ZigbeeApp/Shared/Phone/UserCenter/Device/DeviceListMainForm.cs | 1161 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 1,161 insertions(+), 0 deletions(-)

diff --git a/ZigbeeApp/Shared/Phone/UserCenter/Device/DeviceListMainForm.cs b/ZigbeeApp/Shared/Phone/UserCenter/Device/DeviceListMainForm.cs
new file mode 100755
index 0000000..0dc5e74
--- /dev/null
+++ b/ZigbeeApp/Shared/Phone/UserCenter/Device/DeviceListMainForm.cs
@@ -0,0 +1,1161 @@
+锘縰sing Shared.Common;
+using System;
+using System.Collections.Generic;
+using System.Text;
+using ZigBee.Device;
+
+namespace Shared.Phone.UserCenter.Device
+{
+    /// <summary>
+    /// 璁惧鍒楄〃鐨勪富鐣岄潰
+    /// </summary>
+    public class DeviceListMainForm : EditorCommonForm
+    {
+        #region 鈻� 鍙橀噺澹版槑___________________________
+
+        /// <summary>
+        /// 缃戝叧鎺т欢
+        /// </summary>
+        private MyGatewayControl gatewayViewRow = null;
+        /// <summary>
+        /// 鍒楄〃鎺т欢
+        /// </summary>
+        private VerticalListRefreshControl listView = null;
+        /// <summary>
+        /// 鍓嶄竴娆℃樉绀哄嚭宸︽粦鑿滃崟鐨凴owLayout
+        /// </summary>
+        private RowLayoutControl oldShowRightMuneRow = null;
+        /// <summary>
+        /// 琛屾帶浠剁殑淇℃伅(Keys锛歁ac鍦板潃)
+        /// </summary>
+        private Dictionary<string, DeviceObjRowInfo> dicRowInfo = new Dictionary<string, DeviceObjRowInfo>();
+        /// <summary>
+        /// 閲嶆柊鑾峰彇璁惧鐨勫湪绾跨姸鎬�
+        /// </summary>
+        private bool reGetDeviceOnlineStatu = false;
+        /// <summary>
+        /// 褰撳墠姝e湪鎿嶄綔鐨勮澶囧璞ac鍦板潃(璁惧淇℃伅缂栬緫鐣岄潰鐢�)
+        /// </summary>
+        private string nowActionDeviceMac = null;
+
+        #endregion
+
+        #region 鈻� 鍒濆鍖朹____________________________
+
+        /// <summary>
+        /// 鐢婚潰鏄剧ず(搴曞眰浼氬浐瀹氳皟鐢ㄦ鏂规硶锛屽�熶互瀹屾垚鐢婚潰鍒涘缓)
+        /// </summary>
+        public void ShowForm()
+        {
+            this.ScrollEnabled = false;
+
+            //璁剧疆鏍囬淇℃伅
+            base.SetTitleText(Language.StringByID(R.MyInternationalizationString.DeviceManagement));
+
+            //鍙充笂娣诲姞鎸夐挳
+            var btnAddDeviceIcon = new MostRightIconControl(69, 69);
+            btnAddDeviceIcon.UnSelectedImagePath = "Item/Add.png";
+            topFrameLayout.AddChidren(btnAddDeviceIcon);
+            btnAddDeviceIcon.InitControl();
+            btnAddDeviceIcon.ButtonClickEvent += (sender, e) =>
+            {
+                ZbGateway realWay = null;
+                if (GatewayResourse.NowSelectGateway == null || HdlGatewayLogic.Current.GetRealGateway(ref realWay, GatewayResourse.NowSelectGateway) == false)
+                {
+                    //缃戝叧瀵硅薄寮傚父,璇烽噸鏂伴�夋嫨缃戝叧
+                    string msg = Language.StringByID(R.MyInternationalizationString.uGatewayIsErrorAndReSelect);
+                    this.ShowMassage(ShowMsgType.Error, msg, () =>
+                    {
+                        var form2 = new GatewayManage.GatewayListForm();
+                        form2.AddForm();
+                    });
+                    return;
+                }
+                GatewayResourse.NowSelectGateway = realWay;
+
+                var form = new DeviceDirection.AddDeviceTypeListForm();
+                form.AddForm();
+            };
+
+            //鍒濆鍖栦腑閮ㄦ帶浠�
+            this.InitMiddleFrame();
+        }
+
+        /// <summary>
+        /// 鍒濆鍖栦腑閮ㄦ帶浠�(澶栭儴鍙互璋冪敤)
+        /// </summary>
+        /// <param name="i_reGetDeviceOnlineStatu">閲嶆柊鑾峰彇璁惧鐨勫湪绾跨姸鎬�</param>
+        public void InitMiddleFrame(bool i_reGetDeviceOnlineStatu = true)
+        {
+            this.reGetDeviceOnlineStatu = i_reGetDeviceOnlineStatu;
+            //娓呯┖bodyFrame
+            this.ClearBodyFrame();
+
+            //鍒濆鍖栫綉鍏宠鎺т欢
+            GatewayResourse.NowSelectGateway = HdlGatewayLogic.Current.GetLocalGateway(GatewayResourse.AppOldSelectGatewayId);
+            this.gatewayViewRow = new MyGatewayControl(GatewayResourse.NowSelectGateway);
+            bodyFrameLayout.AddChidren(gatewayViewRow);
+            gatewayViewRow.InitControl();
+
+            //鍒濆鍖栨悳绱㈡帶浠�
+            this.InitSearchControl();
+
+            HdlThreadLogic.Current.RunThread(() =>
+            {
+                //鍒濆鍖栬澶囧垪琛ㄦ帶浠�
+                this.InitDeviceListControl();
+            });
+        }
+
+        #endregion
+
+        #region 鈻� 鍒濆鍖栨悳绱㈡帶浠禵____________________
+
+        /// <summary>
+        /// 鍒濆鍖栨悳绱㈡帶浠�
+        /// </summary>
+        private void InitSearchControl()
+        {
+            //鐧借壊鑳屾櫙
+            var frame = new FrameLayout();
+            frame.BackgroundColor = UserCenterColor.Current.White;
+            frame.Y = this.gatewayViewRow.Bottom + Application.GetRealHeight(23);
+            frame.Height = bodyFrameLayout.Height - this.gatewayViewRow.Bottom - Application.GetRealHeight(23);
+            bodyFrameLayout.AddChidren(frame);
+
+            //鎼滅储璁惧鍏抽敭璇�
+            string textTip = Language.StringByID(R.MyInternationalizationString.uSearchDeviceKeyWorld);
+            var txtSearchControl = new SearchTextControl(textTip);
+            frame.AddChidren(txtSearchControl);
+            txtSearchControl.Y = Application.GetRealHeight(46);
+            //缁戝畾鍥炶皟鍑芥暟
+            txtSearchControl.BindEvent(this.SetRowDataBySearchKeys);
+
+            //鍒楄〃鎺т欢
+            listView = new VerticalListRefreshControl(29);
+            listView.Y = txtSearchControl.Bottom + Application.GetRealHeight(29);
+            listView.Height = frame.Height - txtSearchControl.Bottom - Application.GetRealHeight(29);
+            frame.AddChidren(listView);
+            listView.BeginHeaderRefreshingAction += () =>
+            {
+                HdlThreadLogic.Current.RunThread(() =>
+                {
+                    //涓嬫媺鍒锋柊
+                    this.ListViewBeginHeaderRefreshing();
+                });
+            };
+        }
+
+        #endregion
+
+        #region 鈻� 鍒濆鍖栬澶囧垪琛ㄦ帶浠禵________________
+
+        /// <summary>
+        /// 鍒濆鍖栬澶囧垪琛ㄦ帶浠�
+        /// </summary>
+        private void InitDeviceListControl()
+        {
+            //鑾峰彇璁惧鍒楄〃
+            string gwID = HdlGatewayLogic.Current.GetGatewayId(GatewayResourse.NowSelectGateway);
+            var listDevice = Common.LocalDevice.Current.GetDeviceByGatewayID(gwID);
+            var listSpecialOta = Common.LocalDevice.Current.GetSpecialOtaDevice(gwID);
+            listDevice.AddRange(listSpecialOta);
+
+            this.dicRowInfo.Clear();
+
+            //娌℃湁璁惧
+            if (listDevice.Count == 0)
+            {
+                return;
+            }
+
+            //鏍规嵁MAC鍚堝苟璁惧鍒楄〃
+            this.MargeAllDeviceByMac(listDevice);
+
+            if (this.Parent == null)
+            {
+                return;
+            }
+            HdlThreadLogic.Current.RunMain(() =>
+            {
+                var listOta = new List<OTADevice>();
+                foreach (var macAddress in this.dicRowInfo.Keys)
+                {
+                    //鑾峰彇ota璁惧
+                    var ota = Common.LocalDevice.Current.GetOTADevice(macAddress);
+                    if (ota != null)
+                    {
+                        listOta.Add(ota);
+                    }
+                    //娣诲姞璁惧鐨勮彍鍗曡
+                    this.AddDeviceMenuRow(macAddress);
+                }
+
+                //寮�鍚綉鍏冲湪绾跨洃娴嬬殑绾跨▼
+                this.StartGatewayOnlieCheckThread();
+                //妫�娴嬭澶囨柊鐗堟湰
+                this.CheckDeviceNewVersion(listOta);
+            });
+        }
+
+        #endregion
+
+        #region 鈻� 娣诲姞璁惧鑿滃崟琛宊____________________
+
+        /// <summary>
+        /// 娣诲姞璁惧鐨勮彍鍗曡
+        /// </summary>
+        /// <param name="deviceMac">璁惧Mac鍦板潃</param>
+        private void AddDeviceMenuRow(string deviceMac)
+        {
+            var rowInfo = this.dicRowInfo[deviceMac];
+
+            //鍒涘缓涓�涓彲浠ュ睍寮�鍜屾敹缂╃殑FrameLayout,鐩稿綋浜庤彍鍗曟爮
+            var frameTable = new FrameListControl(29);
+            frameTable.Height = ControlCommonResourse.ListViewRowHeight + frameTable.rowSpace;
+            listView.AddChidren(frameTable);
+            rowInfo.frameTable = frameTable;
+
+            //鎺т欢
+            var rowMenu = new DeviceObjectControl(deviceMac, listView.rowSpace / 2);
+            rowMenu.MainKeys = deviceMac;
+            frameTable.AddChidren(rowMenu);
+            rowMenu.InitControl();
+            rowInfo.MenuRow = rowMenu;
+            //鍚戝彸鍥炬爣
+            var btnRight = rowMenu.frameTable.AddMostRightEmptyIcon(58, 58);
+            btnRight.UnSelectedImagePath = "Item/RightNext.png";
+            btnRight.SelectedImagePath = "Item/Down.png";
+            rowMenu.frameTable.ChangedChidrenBindMode(btnRight, ChidrenBindMode.NotBind);
+
+            //鎻愮ず鏂扮増鏈�
+            var btnNew = new InformationTipView(rowMenu.btnIcon);
+            btnNew.Visible = false;
+            rowMenu.frameTable.AddChidren(btnNew, ChidrenBindMode.BindEventOnly);
+            rowMenu.AddTag("btnNew", btnNew);
+
+            //妫�娴嬭澶囨槸鍚︽嫢鏈夊畾浣嶇殑鍔熻兘
+            var listdevice = Common.LocalDevice.Current.GetDevicesByMac(deviceMac);
+            if (listdevice.Count > 0 && Common.LocalDevice.Current.DeviceIsCanFixedPosition(listdevice[0]) == true)
+            {
+                //瀹氫綅
+                var btnPosition = rowMenu.AddEditorControl(false);
+                btnPosition.TextID = R.MyInternationalizationString.uFixedPosition;
+                btnPosition.ButtonClickEvent += (sender, e) =>
+                {
+                    //瀹氫綅
+                    Common.LocalDevice.Current.SetFixedPositionCommand(listdevice[0]);
+                };
+            }
+
+            //灞曞紑,鎶樺彔
+            btnRight.ButtonClickEvent += (sender, e) =>
+            {
+                //鍥炶矾鏁板ぇ浜�1鎵嶅睍寮�
+                if (Common.LocalDevice.Current.GetDevicesCountByMac(deviceMac) > 1)
+                {
+                    btnRight.IsSelected = !btnRight.IsSelected;
+                    //灞曞紑鎴栬�呮姌鍙犳槑缁嗗垪琛�
+                    this.ShowDetailList(deviceMac, btnRight.IsSelected);
+                }
+                else
+                {
+                    btnNew.Visible = false;
+                    var form = new DeviceMacInfoEditorForm();
+                    form.AddForm(deviceMac);
+                    //鐣岄潰璺宠浆,璁板綍褰撳墠鐨勬鍦ㄦ搷浣滅殑璁惧鐨凪ac鍦板潃
+                    this.nowActionDeviceMac = deviceMac;
+                }
+            };
+
+            rowMenu.frameTable.ButtonClickEvent += (sender, e) =>
+            {
+                //闅愯棌鑿滃崟
+                rowMenu.HideMenu();
+                //寮哄埗璺宠浆鐪熷疄璁惧鐣岄潰
+                if (UserCenterResourse.HideOption.GotoRealDeviceForm == 1)
+                {
+                    var form2 = new DeviceAddSuccessForm();
+                    form2.AddForm(deviceMac);
+                    return;
+                }
+                btnNew.Visible = false;
+                var form = new DeviceMacInfoEditorForm();
+                form.AddForm(deviceMac);
+                //鐣岄潰璺宠浆,璁板綍褰撳墠鐨勬鍦ㄦ搷浣滅殑璁惧鐨凪ac鍦板潃
+                this.nowActionDeviceMac = deviceMac;
+            };
+            //宸︽粦鑿滃崟浜嬩欢
+            rowMenu.OpenMenuAction += () =>
+            {
+                if (this.oldShowRightMuneRow != null && this.oldShowRightMuneRow.MainKeys != rowMenu.MainKeys)
+                {
+                    //宸︽粦鑿滃崟鍙兘婊戜竴涓�
+                    this.oldShowRightMuneRow.HideMenu();
+                }
+                this.oldShowRightMuneRow = rowMenu;
+            };
+        }
+
+        #endregion
+
+        #region 鈻� 灞曞紑鎶樺彔___________________________
+
+        /// <summary>
+        /// 灞曞紑鎴栬�呴殣钘忓垪琛�
+        /// </summary>
+        /// <param name="deviceMac">璁惧Mac鍦板潃</param>
+        /// <param name="isShow">鏄惁灞曞紑</param>
+        private void ShowDetailList(string deviceMac, bool isShow)
+        {
+            var rowInfo = this.dicRowInfo[deviceMac];
+            //瀹冨師鏉ョ殑楂樺害
+            int oldHeight = rowInfo.frameTable.Height;
+            //鍙樻洿鐨勯珮搴�,榛樿涓哄垪琛ㄩ殣钘�
+            int heightValue = ControlCommonResourse.ListViewRowHeight + rowInfo.frameTable.rowSpace;
+            var listDevice = Common.LocalDevice.Current.GetDevicesByMac(deviceMac);
+            if (isShow == true)
+            {
+                //灞曞紑妯″紡鏃讹紝鎵╁ぇ渚濇嵁涓�:瀹冩湁鍑犱釜瀛愭帶浠�
+                heightValue = (listDevice.Count + 1) * (ControlCommonResourse.ListViewRowHeight + rowInfo.frameTable.rowSpace);
+                //鏍囬鑷繁灏辨槸涓�涓瓙鎺т欢
+                if (rowInfo.frameTable.ChildrenCount == 1)
+                {
+                    //鑾峰彇杩欎竴鍫嗚澶囨椂灞炰簬浠�涔堢被鍨嬬殑
+                    var deviceEnumInfo = Common.LocalDevice.Current.GetMyDeviceEnumInfo(listDevice);
+                    foreach (CommonDevice info in listDevice)
+                    {
+                        //鍔犺浇瀹冪殑鍒楄〃
+                        this.AddDeviceDetailRow(rowInfo.frameTable, info, deviceEnumInfo);
+                    }
+                }
+            }
+            //鑷韩楂樺害鍙樻洿
+            rowInfo.frameTable.Height = heightValue;
+        }
+
+        /// <summary>
+        /// 娣诲姞璁惧鐨勬槑缁嗚
+        /// </summary>
+        /// <param name="frame">瀹瑰櫒</param>
+        /// <param name="device"></param>
+        /// <param name="deviceEnumInfo"></param>
+        private void AddDeviceDetailRow(FrameListControl frame, CommonDevice device, DeviceEnumInfo deviceEnumInfo)
+        {
+            var rowInfo = this.dicRowInfo[device.DeviceAddr];
+            if (rowInfo.dicDetailRow == null)
+            {
+                rowInfo.dicDetailRow = new Dictionary<string, DeviceRoomControl>();
+            }
+
+            //琛屾帶浠�
+            var rowDevice = new DeviceRoomControl(device, frame.rowSpace / 2);
+            rowDevice.MainKeys = LocalDevice.Current.GetDeviceMainKeys(device);
+            frame.AddChidren(rowDevice);
+            rowDevice.frameTable.LeftOffset = Application.GetRealWidth(173) - ControlCommonResourse.XXLeft;
+            rowDevice.InitControl();
+            //搴曠嚎
+            rowDevice.frameTable.AddBottomLine();
+            //鍙崇澶�
+            rowDevice.frameTable.AddRightArrow();
+            //鍦ㄧ嚎鐘舵��
+            rowDevice.isOnline = device.IsOnline == 1;
+
+            //淇濆瓨鎺т欢
+            string maikey = Common.LocalDevice.Current.GetDeviceMainKeys(device);
+            rowInfo.dicDetailRow[maikey] = rowDevice;
+
+            //妫�娴嬭澶囨槸鍚︽嫢鏈夊畾浣嶇殑鍔熻兘
+            if (Common.LocalDevice.Current.DeviceIsCanFixedPosition(device) == true)
+            {
+                //瀹氫綅
+                var btnPosition = rowDevice.AddEditorControl(false);
+                btnPosition.TextID = R.MyInternationalizationString.uFixedPosition;
+                btnPosition.ButtonClickEvent += (sender, e) =>
+                {
+                    //瀹氫綅
+                    Common.LocalDevice.Current.SetFixedPositionCommand(device);
+                };
+            }
+
+            rowDevice.frameTable.ButtonClickEvent += (sender, e) =>
+            {
+                //闅愯棌鑿滃崟
+                rowDevice.HideMenu();
+                //鐣岄潰璺宠浆,璁板綍褰撳墠鐨勬鍦ㄦ搷浣滅殑璁惧鐨凪ac鍦板潃
+                this.nowActionDeviceMac = device.DeviceAddr;
+                //鏄剧ず璁惧鍔熻兘閰嶇疆鐣岄潰
+                this.ShowDeviceFunctionSettionForm(device, deviceEnumInfo);
+            };
+            //宸︽粦鑿滃崟浜嬩欢
+            rowDevice.OpenMenuAction += () =>
+            {
+                if (this.oldShowRightMuneRow != null && this.oldShowRightMuneRow.MainKeys != rowDevice.MainKeys)
+                {
+                    //宸︽粦鑿滃崟鍙兘婊戜竴涓�
+                    this.oldShowRightMuneRow.HideMenu();
+                }
+                this.oldShowRightMuneRow = rowDevice;
+            };
+        }
+
+        /// <summary>
+        /// 鏄剧ず璁惧鍔熻兘閰嶇疆鐣岄潰
+        /// </summary>
+        /// <param name="device"></param>
+        /// <param name="deviceEnumInfo"></param>
+        private void ShowDeviceFunctionSettionForm(CommonDevice device, DeviceEnumInfo deviceEnumInfo)
+        {
+            //鏅鸿兘闂ㄩ攣
+            if (deviceEnumInfo.BeloneType == DeviceBeloneType.A鏅鸿兘闂ㄩ攣)
+            {
+                var form = new DeviceMacInfoEditorForm();
+                form.AddForm(device.DeviceAddr);
+            }
+            else if (deviceEnumInfo.BeloneType == DeviceBeloneType.A绐楀笜)
+            {
+                var form = new DeviceMacInfoEditorForm();
+                form.AddForm(device.DeviceAddr);
+            }
+            //pir浼犳劅鍣�
+            else if (deviceEnumInfo.ConcreteType == DeviceConcreteType.Sensor_Pir)
+            {
+                if (device is IASZone)
+                {
+                    var form = new DevicePirSensor.PirSensorBindTargetSettionForm();
+                    form.AddForm((IASZone)device);
+                }
+                else
+                {
+                    //pir浼犳劅鍣�,浠栦滑鍙堟悶浜嗕釜缁х數鍣ㄥ湪閲岄潰
+                    var form = new DeviceFunctionSettionForm();
+                    form.AddForm(device, true);
+                }
+            }
+            //涓ぎ绌鸿皟
+            else if (deviceEnumInfo.ConcreteType == DeviceConcreteType.AirConditioner_ZbGateway)
+            {
+                var form = new DeviceAirConditioner.IndoorUnitSettionForm();
+                form.AddForm((AC)device);
+            }
+            //鐜闈㈡澘
+            else if (deviceEnumInfo.ConcreteType == DeviceConcreteType.ButtonPanel_FangyueEnvironment)
+            {
+                var form = new DeviceFunctionSettionForm();
+                form.AddForm(device, true);
+            }
+            //鏂伴闈㈡澘
+            else if (deviceEnumInfo.ConcreteType == DeviceConcreteType.ButtonPanel_FangyueFreshAir)
+            {
+                //鏂规偊鏂伴闈㈡澘鐨勬寜閿厤缃�
+                var form = new DevicePanel.PanelFangyueFreshAirButtonSettionForm();
+                form.AddForm(device);
+            }
+            //鏂规偊闈㈡澘
+            else if (deviceEnumInfo.ConcreteType == DeviceConcreteType.ButtonPanel_FangyueTwo
+                || deviceEnumInfo.ConcreteType == DeviceConcreteType.ButtonPanel_FangyueFour
+                || deviceEnumInfo.ConcreteType == DeviceConcreteType.ButtonPanel_FangyueEight)
+            {
+                //骞叉帴鐐�
+                if (device.Type == DeviceType.OnOffSwitch)
+                {
+                    //鏂规偊闈㈡澘鐨勬寜閿厤缃�
+                    var form = new DevicePanel.PanelFangyueButtonSettionForm();
+                    form.AddForm(device);
+                }
+                //缁х數鍣�
+                else if (device.Type == DeviceType.OnOffOutput)
+                {
+                    //鏂规偊闈㈡澘鐨勫姛鑳介厤缃�
+                    var form = new DevicePanel.PanelFangyueFunctionSettionForm();
+                    form.AddForm(device);
+                }
+                else
+                {
+                    var form = new DeviceFunctionSettionForm();
+                    form.AddForm(device, true);
+                }
+            }
+            //闈㈡澘璁惧
+            else if (deviceEnumInfo.BeloneType == DeviceBeloneType.A鎸夐敭闈㈡澘)
+            {
+                //骞叉帴鐐�
+                if (device.Type == DeviceType.OnOffSwitch)
+                {
+                    //娌充笢璁惧
+                    if (deviceEnumInfo.IsHdlDevice == true)
+                    {
+                        var form = new DevicePanel.PanelButtonSettionForm();
+                        form.AddForm(device);
+                    }
+                    else
+                    {
+                        var form = new DeviceDryContactSettionForm();
+                        form.AddForm(device);
+                    }
+                }
+                //缁х數鍣�
+                else if (device.Type == DeviceType.OnOffOutput)
+                {
+                    //娌充笢璁惧
+                    if (deviceEnumInfo.IsHdlDevice == true)
+                    {
+                        var form = new DevicePanel.PanelFunctionSettionForm();
+                        form.AddForm(device);
+                    }
+                    else
+                    {
+                        var form = new DeviceFunctionSettionForm();
+                        form.AddForm(device, true);
+                    }
+                }
+                else
+                {
+                    var form = new DeviceFunctionSettionForm();
+                    form.AddForm(device, true);
+                }
+            }
+            //濡傛灉鏄共鎺ョ偣
+            else if (device.Type == DeviceType.OnOffSwitch)
+            {
+                var form = new DeviceDryContactSettionForm();
+                form.AddForm(device);
+            }
+            else
+            {
+                var form = new DeviceFunctionSettionForm();
+                form.AddForm(device, true);
+            }
+        }
+
+        #endregion
+
+        #region 鈻� 閿�兼悳绱__________________________
+
+        /// <summary>
+        /// 鏍规嵁鎼滅储閿�硷紝璁惧畾鍒楄〃鏁版嵁
+        /// </summary>
+        /// <param name="searchKey">Search key.</param>
+        private void SetRowDataBySearchKeys(string searchKey)
+        {
+            lock (dicRowInfo)
+            {
+                Application.RunOnMainThread(() =>
+                {
+                    if (this.listView == null)
+                    {
+                        return;
+                    }
+                    //棣栧厛鍏堢Щ闄ゅ垪琛ㄦ墍鏈夋帶浠�
+                    this.listView.RemoveAll();
+                    //濡傛灉鎼滅储閿�间负绌猴紝鍒欒繕鍘熶负鍘熷鐘舵��:鏄剧ず璁惧绫诲瀷鎬昏
+                    if (searchKey == string.Empty)
+                    {
+                        foreach (var deviceMac in dicRowInfo.Keys)
+                        {
+                            //娣诲姞璁惧鐨勮
+                            this.AddDeviceMenuRow(deviceMac);
+                        }
+                        //娣诲姞搴曢儴闂撮殭
+                        var frameTemp = new FrameLayout();
+                        frameTemp.Height = Application.GetRealHeight(23);
+                        listView.AddChidren(frameTemp);
+                    }
+                    else
+                    {
+                        //鎼滅储鍚嶅瓧閲岄潰鍖呭惈閿�肩殑璁惧
+                        foreach (var rowInfo in this.dicRowInfo.Values)
+                        {
+                            if ((rowInfo.MacName != null && rowInfo.MacName.Contains(searchKey) == true)
+                                || rowInfo.DeviveTypeName.Contains(searchKey) == true)
+                            {
+                                //娣诲姞璁惧鐨勮
+                                this.AddDeviceMenuRow(rowInfo.DeviceMac);
+                            }
+                        }
+                        //娣诲姞搴曢儴闂撮殭
+                        var frameTemp = new FrameLayout();
+                        frameTemp.Height = Application.GetRealHeight(23);
+                        listView.AddChidren(frameTemp);
+                    }
+                });
+            }
+        }
+
+        #endregion
+
+        #region 鈻� 涓嬫媺鍒锋柊___________________________
+
+        /// <summary>
+        /// 婊戝姩鎺т欢涓嬫媺鍒锋柊
+        /// </summary>
+        private async void ListViewBeginHeaderRefreshing()
+        {
+            //濡傛灉鏄湪绾跨殑
+            if (HdlGatewayLogic.Current.CheckGatewayOnlineByFlag(GatewayResourse.NowSelectGateway) == true)
+            {
+                //妫�娴嬪箍鎾埌鐨勮繖涓綉鍏虫槸鍚︽嫢鏈変綇瀹匢D
+                ZbGateway realWay = null;
+                if (HdlGatewayLogic.Current.GetRealGateway(ref realWay, GatewayResourse.NowSelectGateway) == true)
+                {
+                    //閲嶆柊璁剧疆浣忓畢ID(杩欎釜搴旇鏄笉缁忚繃APP,鐩存帴鎶婄綉鍏虫仮澶嶄簡鍑哄巶璁剧疆)
+                    if (HdlGatewayLogic.Current.HomeIdIsEmpty(realWay.getGatewayBaseInfo.HomeId) == true)
+                    {
+                        //鏄剧ず杩涘害鏉�
+                        ProgressBar.Show();
+                        int result2 = await HdlGatewayLogic.Current.ReBindNewGateway(realWay);
+                        //鍏抽棴杩涘害鏉�
+                        ProgressBar.Close();
+                        if (result2 == -1)
+                        {
+                            return;
+                        }
+                    }
+                }
+            }
+            if (this.Parent == null)
+            {
+                return;
+            }
+
+            //鑾峰彇鍏ㄩ儴璁惧
+            int result = LocalDevice.Current.SetDeviceToMemmoryByGateway(GatewayResourse.NowSelectGateway);
+            if (this.Parent == null)
+            {
+                return;
+            }
+            HdlThreadLogic.Current.RunMain(() =>
+            {
+                //闅愯棌涓嬫媺鍒锋柊鐗规晥
+                listView.EndHeaderRefreshing();
+                if (result != -1)
+                {
+                    //閲嶆柊鍒锋柊鐣岄潰
+                    this.InitMiddleFrame(false);
+                }
+            });
+        }
+
+        #endregion
+
+        #region 鈻� 缃戝叧鍦ㄧ嚎妫�娴媉______________________
+
+        /// <summary>
+        /// 寮�鍚綉鍏冲湪绾跨洃娴嬬殑绾跨▼
+        /// </summary>
+        private void StartGatewayOnlieCheckThread()
+        {
+            if (GatewayResourse.NowSelectGateway == null)
+            {
+                return;
+            }
+
+            string selectGwId = HdlGatewayLogic.Current.GetGatewayId(GatewayResourse.NowSelectGateway);
+            HdlThreadLogic.Current.RunThread(() =>
+            {
+                ZbGateway zbGateway = HdlGatewayLogic.Current.GetLocalGateway(selectGwId);
+                if (zbGateway == null)
+                {
+                    return;
+                }
+                //鍒锋柊缃戝叧鍦ㄧ嚎鐘舵��
+                HdlGatewayLogic.Current.RefreshGatewayOnlineStatu(new List<ZbGateway>() { zbGateway });
+
+                Application.RunOnMainThread(() =>
+                {
+                    if (this.gatewayViewRow != null && this.gatewayViewRow.zbGatewayId == selectGwId)
+                    {
+                        bool online = HdlGatewayLogic.Current.CheckGatewayOnlineByFlag(zbGateway);
+                        this.gatewayViewRow.RefreshControl();
+                        //寮�鍚澶囧湪绾跨嚎绋�
+                        this.StartDeviceListControlThread(online);
+                    }
+                });
+            });
+        }
+
+        /// <summary>
+        /// 缃戝叧鍦ㄧ嚎鐘舵�佸彉鏇�
+        /// </summary>
+        /// <param name="gateWay">缃戝叧瀵硅薄</param>
+        /// <param name="online">鍦ㄧ嚎鐘舵�佸彉鏇村悗鐨勭姸鎬�</param>
+        public override void GatewayOnlinePush(ZbGateway gateWay, bool online)
+        {
+            if (this.gatewayViewRow == null)
+            {
+                return;
+            }
+            if (HdlGatewayLogic.Current.GetGatewayId(gateWay) == this.gatewayViewRow.zbGatewayId)
+            {
+                Application.RunOnMainThread(() =>
+                {
+                    this.gatewayViewRow?.RefreshControl();
+                });
+            }
+        }
+
+        #endregion
+
+        #region 鈻� 璁惧鍦ㄧ嚎妫�娴媉______________________
+
+        /// <summary>
+        /// 寮�鍚澶囧湪绾跨嚎绋�
+        /// </summary>
+        /// <param name="gatewayOnline">缃戝叧鐨勫湪绾跨姸鎬�</param>
+        private void StartDeviceListControlThread(bool gatewayOnline)
+        {
+            if (gatewayOnline == false)
+            {
+                //璁剧疆鍏ㄩ儴璁惧绂荤嚎
+                this.SetAllDeviceOffLine();
+                return;
+            }
+            //寮�鍚紶鎰熷櫒鎶ヨ鐩戣
+            this.StartCheckDeviceAlarm();
+            //寮�鍚澶囧湪绾跨洃娴�
+            this.StartCheckDeviceOnline();
+        }
+
+        /// <summary>
+        /// 寮�鍚澶囧湪绾跨洃娴�
+        /// </summary>
+        private void StartCheckDeviceOnline()
+        {
+            //澶栭儴璋冪敤鐨勮瘽,涓嶅啀閲嶆柊鑾峰彇璁惧鐘舵��
+            if (GatewayResourse.NowSelectGateway == null || this.reGetDeviceOnlineStatu == false)
+            {
+                return;
+            }
+
+            //娣诲姞鎺ユ敹璁惧鍦ㄧ嚎涓婃姤鐨勭洃鍚�
+            HdlGatewayReceiveLogic.Current.AddAttributeEvent("DeviceListFormReceivePushOnline", ReceiveComandDiv.A璁惧鍦ㄧ嚎涓婃姤, this.ReceiveDeviceStatu);
+
+            string gwId = HdlGatewayLogic.Current.GetGatewayId(GatewayResourse.NowSelectGateway);
+            HdlThreadLogic.Current.RunThread(() =>
+            {
+                //杩欓噷涓昏鍙槸鑾峰彇鍦ㄧ嚎鐘舵��
+                var zbway = HdlGatewayLogic.Current.GetLocalGateway(gwId);
+                int statu = 0;
+                var list = LocalDevice.Current.GetDeviceListFromGateway(zbway, ref statu, false, ShowErrorMode.NO);
+                if (statu != -1)
+                {
+                    for (int i = 0; i < list.Count; i++)
+                    {
+                        //璁剧疆璁惧鍦ㄧ嚎鐘舵��
+                        this.ReceiveDeviceStatu(list[i]);
+                    }
+                }
+            });
+        }
+
+        /// <summary>
+        /// 鎺ュ彈璁惧鐘舵��
+        /// </summary>
+        /// <param name="device"></param>
+        private void ReceiveDeviceStatu(CommonDevice device)
+        {
+            DeviceObjRowInfo rowInfo = null;
+            if (this.dicRowInfo.ContainsKey(device.DeviceAddr) == true)
+            {
+                rowInfo = this.dicRowInfo[device.DeviceAddr];
+            }
+            if (rowInfo == null || rowInfo.MenuRow == null)
+            {
+                return;
+            }
+            //鍒锋柊璁惧鐨勫湪绾跨姸鎬�
+            string mainkeys = Common.LocalDevice.Current.GetDeviceMainKeys(device);
+            var localDevice = Common.LocalDevice.Current.GetDevice(mainkeys);
+            if (localDevice != null)
+            {
+                //鍦ㄧ嚎鐘舵�佷竴鏍风殑璇濓紝涓嶉渶瑕佸埛鏂�
+                if (localDevice.IsOnline == device.IsOnline)
+                {
+                    return;
+                }
+                //淇濆瓨鐘舵��
+                localDevice.IsOnline = device.IsOnline;
+                localDevice.ReSave();
+            }
+
+            HdlThreadLogic.Current.RunMain(() =>
+            {
+                if (rowInfo != null)
+                {
+                    rowInfo.MenuRow.isOnline = device.IsOnline == 1;
+                    if (rowInfo.dicDetailRow != null)
+                    {
+                        foreach (var detailRow in rowInfo.dicDetailRow.Values)
+                        {
+                            detailRow.isOnline = rowInfo.MenuRow.isOnline;
+                        }
+                    }
+                }
+            });
+        }
+
+        /// <summary>
+        /// 璁剧疆鍏ㄩ儴璁惧绂荤嚎
+        /// </summary>
+        private void SetAllDeviceOffLine()
+        {
+            lock (dicRowInfo)
+            {
+                foreach (var rowInfo in this.dicRowInfo.Values)
+                {
+                    Application.RunOnMainThread(() =>
+                    {
+                        if (rowInfo.MenuRow != null)
+                        {
+                            rowInfo.MenuRow.isOnline = false;
+                        }
+                    });
+                }
+            }
+        }
+
+        #endregion
+
+        #region 鈻� 浼犳劅鍣ㄦ姤璀________________________
+
+        /// <summary>
+        /// 寮�鍚紶鎰熷櫒鎶ヨ鐩戣
+        /// </summary>
+        private void StartCheckDeviceAlarm()
+        {
+            HdlGatewayReceiveLogic.Current.AddAttributeEvent("DeviceListFormSensor", ReceiveComandDiv.A浼犳劅鍣ㄤ笂鎶�, (device) =>
+             {
+                 HdlThreadLogic.Current.RunMain(() =>
+                 {
+                     if (this.dicRowInfo.ContainsKey(device.DeviceAddr) == false)
+                     {
+                         return;
+                     }
+                     //鏄剧ず浼犳劅鍣ㄤ笂鎶ョ殑鐗规晥
+                     this.dicRowInfo[device.DeviceAddr].MenuRow?.StartSensorPushAppeal();
+                 });
+             });
+        }
+
+        #endregion
+
+        #region 鈻� 璁惧鏂扮増鏈琠________________________
+
+        /// <summary>
+        /// 妫�娴嬭澶囨柊鐗堟湰
+        /// </summary>
+        /// <param name="list">ota璁惧</param>
+        private void CheckDeviceNewVersion(List<OTADevice> list)
+        {
+            HdlThreadLogic.Current.RunThread(async () =>
+            {
+                await System.Threading.Tasks.Task.Delay(2000);
+                foreach (var ota in list)
+                {
+                    if (this.Parent == null)
+                    {
+                        return;
+                    }
+                    //娣诲姞鍗囩骇鍥轰欢淇℃伅(鎴愪笉鎴愬姛閮芥棤鎵�璋�)
+                    var result = await HdlFirmwareUpdateLogic.AddFirmwareVersionInfo(FirmwareLevelType.ZigbeeDevice, ota.HwVersion.ToString(), ota.ImgTypeId.ToString());
+
+                    //鑾峰彇璁惧鏈�鏂扮増鏈�
+                    var deviceFirmware = HdlFirmwareUpdateLogic.GetFirmwareMostVersionInfo(FirmwareLevelType.ZigbeeDevice,
+                        ota.HwVersion.ToString(),
+                        ota.ImgTypeId.ToString(),
+                        ota.ImgVersion);
+
+                    if (deviceFirmware == null)
+                    {
+                        continue;
+                    }
+
+                    //鎷ユ湁鏂扮増鏈�
+                    Application.RunOnMainThread(() =>
+                    {
+                        if (this.dicRowInfo.ContainsKey(ota.DeviceAddr) == true)
+                        {
+                            var row = this.dicRowInfo[ota.DeviceAddr].MenuRow;
+                            if (row != null)
+                            {
+                                var btnNew = (InformationTipView)row.GetTagByKey("btnNew");
+                                if (btnNew != null)
+                                {
+                                    btnNew.Visible = true;
+                                }
+                            }
+                        }
+                    });
+                }
+            });
+        }
+
+        #endregion
+
+        #region 鈻� 瀹炵幇澶栭儴璋冪敤_______________________
+
+        /// <summary>
+        /// 娣诲姞鏂扮殑璁惧鍒扮晫闈㈡甯冧腑
+        /// </summary>
+        /// <param name="deviceAddr">璁惧Mac鍦板潃</param>
+        public void AddDeviceToFormTable(string deviceAddr)
+        {
+            //鏂板缓涓�涓璞�
+            if (this.dicRowInfo.ContainsKey(deviceAddr) == false)
+            {
+                var localDevice = Common.LocalDevice.Current.GetDevicesByMac(deviceAddr);
+                if (localDevice.Count == 0)
+                {
+                    //閽堝鍗曠函鍙湁涓�涓�200绔偣鐨勮澶�
+                    var ota = Common.LocalDevice.Current.GetOTADevice(deviceAddr);
+                    if (ota == null)
+                    {
+                        //鍏ョ綉涔嬪悗锛屽張鎶婂畠鍒犱簡
+                        return;
+                    }
+                    localDevice.Add(ota);
+                }
+                var rowNewInfo = new DeviceObjRowInfo();
+                rowNewInfo.DeviceMac = deviceAddr;
+                rowNewInfo.MacName = Common.LocalDevice.Current.GetDeviceMacName(localDevice[0]);
+                rowNewInfo.DeviveTypeName = Common.LocalDevice.Current.GetDeviceObjectText(localDevice);
+                this.dicRowInfo[deviceAddr] = rowNewInfo;
+
+                //鍒涘缓鏂扮殑琛�
+                this.AddDeviceMenuRow(deviceAddr);
+            }
+        }
+
+        #endregion
+
+        #region 鈻� 鍚堝苟鏁版嵁___________________________
+
+        /// <summary>
+        /// 鏍规嵁MAC鍚堝苟璁惧鍒楄〃
+        /// </summary>
+        /// <param name="listDevice"></param>
+        private void MargeAllDeviceByMac(List<CommonDevice> listDevice)
+        {
+            //鏍规嵁Mac鍏ㄩ儴鍒嗙粍
+            var dic = new Dictionary<string, List<CommonDevice>>();
+            foreach (CommonDevice device in listDevice)
+            {
+                if (device == null || device.DeviceAddr == null)
+                {
+                    continue;
+                }
+                if (dic.ContainsKey(device.DeviceAddr) == false)
+                {
+                    dic[device.DeviceAddr] = new List<CommonDevice>();
+                }
+                dic[device.DeviceAddr].Add(device);
+            }
+            //鑾峰彇淇℃伅
+            foreach (var mac in dic.Keys)
+            {
+                var info = new DeviceObjRowInfo();
+                info.DeviceMac = mac;
+                info.MacName = Common.LocalDevice.Current.GetDeviceMacName(dic[mac][0]);
+                info.DeviveTypeName = Common.LocalDevice.Current.GetDeviceObjectText(dic[mac]);
+                this.dicRowInfo[mac] = info;
+            }
+        }
+
+        #endregion
+
+        #region 鈻� 鐣岄潰閲嶆柊婵�娲讳簨浠禵__________________
+
+        /// <summary>
+        /// 鑷韩鐨勪笂灞傜晫闈㈠叧闂悗,瀹冭嚜韬浜庢渶涓婂眰鏃�,瑙﹀彂鐨勪簨浠�
+        /// </summary>
+        public override int FormActionAgainEvent()
+        {
+            if (this.nowActionDeviceMac != null)
+            {
+                var rowInfo = this.dicRowInfo[nowActionDeviceMac];
+                //妫�娴嬭繖涓澶囨槸鍚﹁鍒犻櫎 2020.01.13鍙樻洿:杩藉姞Ota璁惧鐨勫垽鏂�
+                if (Common.LocalDevice.Current.GetDevicesByMac(nowActionDeviceMac).Count == 0
+                    && Common.LocalDevice.Current.GetOTADevice(nowActionDeviceMac) == null)
+                {
+                    //绉婚櫎鎺т欢
+                    rowInfo.dicDetailRow = null;
+                    rowInfo.frameTable.RemoveFromParent();
+
+                    this.dicRowInfo.Remove(nowActionDeviceMac);
+                    rowInfo = null;
+                }
+                else
+                {
+                    //鍒锋柊璁惧淇℃伅
+                    rowInfo.MenuRow?.RefreshControlInfo(true);
+                    if (rowInfo.dicDetailRow != null)
+                    {
+                        foreach (var contr in rowInfo.dicDetailRow.Values)
+                        {
+                            contr?.RefreshControlInfo();
+                        }
+                    }
+                }
+            }
+            //娓呯┖璁板綍
+            this.nowActionDeviceMac = null;
+            //缃戝叧鎺т欢鍒锋柊
+            this.gatewayViewRow.RefreshControl();
+
+            return 1;
+        }
+
+        #endregion
+
+        #region 鈻� 鍏抽棴鐣岄潰___________________________
+
+        /// <summary>
+        /// 鐢婚潰鍏抽棴
+        /// </summary>
+        public override void CloseFormBefore()
+        {
+            HdlGatewayReceiveLogic.Current.RemoveEvent("DeviceListFormSensor");
+            HdlGatewayReceiveLogic.Current.RemoveEvent("DeviceListFormReceivePushOnline");
+
+            GatewayResourse.NowSelectGateway = null;
+
+            base.CloseFormBefore();
+        }
+
+        #endregion
+
+        #region 鈻� 缁撴瀯浣撶被___________________________
+
+        /// <summary>
+        /// 璁惧琛屼俊鎭�
+        /// </summary>
+        private class DeviceObjRowInfo
+        {
+            /// <summary>
+            /// 璁惧Mac鍦板潃
+            /// </summary>
+            public string DeviceMac = string.Empty;
+            /// <summary>
+            /// 璁惧鐨凪AC鍚嶅瓧
+            /// </summary>
+            public string MacName = string.Empty;
+            /// <summary>
+            /// 璁惧绫诲瀷鐨勬枃鏈俊鎭�
+            /// </summary>
+            public string DeviveTypeName = string.Empty;
+            /// <summary>
+            /// 鑿滃崟琛�
+            /// </summary>
+            public DeviceObjectControl MenuRow = null;
+            /// <summary>
+            /// 妗屽竷FrameLayout
+            /// </summary>
+            public FrameListControl frameTable = null;
+            /// <summary>
+            /// 鏄庣粏琛�
+            /// </summary>
+            public Dictionary<string, DeviceRoomControl> dicDetailRow = null;
+        }
+
+        #endregion
+
+        #region 鈻� 鑷畾涔夌綉鍏虫帶浠禵____________________
+
+        /// <summary>
+        /// 鑷畾涔夌綉鍏虫帶浠�
+        /// </summary>
+        private class MyGatewayControl : FrameRowControl
+        {
+            /// <summary>
+            /// 缃戝叧ID
+            /// </summary>
+            public string zbGatewayId = string.Empty;
+            /// <summary>
+            /// 缃戝叧鍚嶅瓧鎺т欢
+            /// </summary>
+            private NormalViewControl btnName = null;
+
+            /// <summary>
+            /// 鑷畾涔夌綉鍏虫帶浠�
+            /// </summary>
+            /// <param name="i_zbGateway">缃戝叧瀵硅薄</param>
+            public MyGatewayControl(ZbGateway i_zbGateway)
+            {
+                this.UseClickStatu = false;
+                this.zbGatewayId = HdlGatewayLogic.Current.GetGatewayId(i_zbGateway);
+                this.BackgroundColor = UserCenterColor.Current.White;
+                this.Height = Application.GetRealHeight(173);
+            }
+
+            /// <summary>
+            /// 鍒濆鍖栨帶浠�
+            /// </summary>
+            public void InitControl()
+            {
+                //鑾峰彇鏈湴缃戝叧瀵硅薄
+                ZbGateway zbway = HdlGatewayLogic.Current.GetLocalGateway(zbGatewayId);
+                //鍥炬爣
+                var btnIcon = this.AddLeftIcon(81);
+                HdlGatewayLogic.Current.SetGatewayIcon(btnIcon, zbway);
+
+                //鏄剧ず鏂囨湰
+                btnName = this.AddLeftCaption(HdlGatewayLogic.Current.GetGatewayName(zbway), 700);
+                btnName.Height = Application.GetRealHeight(60);
+                btnName.TextSize = 15;
+                btnName.Y = Application.GetRealHeight(35);
+                if (HdlGatewayLogic.Current.CheckGatewayOnlineByFlag(zbway) == false)
+                {
+                    btnName.TextColor = UserCenterColor.Current.TextGrayColor1;
+                }
+
+                //褰撳墠缃戝叧
+                var btnNowGw = this.AddLeftCaption(Language.StringByID(R.MyInternationalizationString.uNowGateway), 700);
+                btnNowGw.Height = Application.GetRealHeight(49);
+                btnNowGw.TextSize = 12;
+                btnNowGw.Y = Application.GetRealHeight(95);
+                btnNowGw.TextColor = UserCenterColor.Current.TextGrayColor1;
+
+                //鍚戝彸鍥炬爣
+                var btnRight = this.AddRightArrow();
+                btnRight.Name = "btnRight";
+                //缃戝叧绠$悊
+                var btnMament = this.AddMostRightView(Language.StringByID(R.MyInternationalizationString.uGatewayManagement), 300);
+                btnMament.Name = "btnMament";
+
+                this.ButtonClickEvent += (sernder, e) =>
+                {
+                    if (string.IsNullOrEmpty(((View)sernder).Name) == false)
+                    {
+                        //鎵撳紑缃戝叧鍒楄〃鐣岄潰
+                        var form = new GatewayManage.GatewayListForm();
+                        form.AddForm();
+                    }
+                };
+            }
+
+            /// <summary>
+            /// 鍒锋柊鎺т欢淇℃伅
+            /// </summary>
+            public void RefreshControl()
+            {
+                //鑾峰彇鏈湴缃戝叧瀵硅薄
+                ZbGateway zbway = HdlGatewayLogic.Current.GetLocalGateway(zbGatewayId);
+                if (zbway == null)
+                {
+                    return;
+                }
+                btnName.Text = HdlGatewayLogic.Current.GetGatewayName(zbway);
+                if (HdlGatewayLogic.Current.CheckGatewayOnlineByFlag(zbway) == false)
+                {
+                    btnName.TextColor = UserCenterColor.Current.TextGrayColor1;
+                }
+                else
+                {
+                    btnName.TextColor = UserCenterColor.Current.TextColor1;
+                }
+            }
+        }
+
+        #endregion
+    }
+}

--
Gitblit v1.8.0