using Shared.Common; using System; using System.Collections.Generic; using System.Text; using ZigBee.Device; namespace Shared.Phone.UserCenter.Gateway { /// /// 网关管理的界面 /// public class GatewayManagementForm : UserCenterCommonForm { #region ■ 变量声明___________________________ /// /// 列表控件 /// private VerticalScrolViewLayout listview = null; /// /// 生成的网关状态控件暂时存入内存中 /// private Dictionary dicRowContr = new Dictionary(); /// /// 关闭设备管理界面(如果解除绑定的网关是当前所选择的网关的话,则关闭设备管理界面) /// private bool closeDeviceManagForm = false; #endregion #region ■ 初始化_____________________________ /// /// 画面显示(底层会固定调用此方法,借以完成画面创建) /// public void ShowForm() { //设置标题信息 base.SetTitleText(Language.StringByID(R.MyInternationalizationString.uGatewayManagement)); //初始化头部控件 this.InitTopFrame(); //初始化中部控件 this.InitMiddleFrame(); } /// /// 初始化头部控件 /// private void InitTopFrame() { //添加图标 var btnAdd = new TopLayoutMostRightView(); btnAdd.UnSelectedImagePath = "Item/Add.png"; btnAdd.SelectedImagePath = "Item/AddSelected.png"; btnAdd.MouseUpEventHandler += (sender, e) => { var form = new SelectNewGateWayForm(); base.AddForm(form); }; topFrameLayout.AddChidren(btnAdd); } /// /// 初始化中部控件 /// private void InitMiddleFrame() { listview = new VerticalScrolViewLayout(); listview.Height = bodyFrameLayout.Height; bodyFrameLayout.AddChidren(listview); //设定中部信息 this.SetMiddleFrameInfo(); } /// /// 设定中部信息 /// private void SetMiddleFrameInfo() { //开启进度条 this.ShowProgressBar(); this.dicRowContr.Clear(); this.listview.RemoveAll(); //设置接受在线状态推送 this.AddGatewayOnlinePush(); new System.Threading.Thread(() => { List listway = Common.LocalGateway.Current.GetAllLocalGateway(); if (listway.Count == 0) { //关闭进度条 this.CloseProgressBar(); return; } int count = 0; foreach(var gwWay in listway) { Application.RunOnMainThread(() => { //添加行 this.AddRowLayout(Common.LocalGateway.Current.GetGatewayId(gwWay)); count++; if (count == listway.Count) { //最后一个时 this.CloseProgressBar(); //开启网关在线监测的线程 this.StartGatewayOnlieCheckThread(listway); } }); } }) { IsBackground = true }.Start(); } #endregion #region ■ 添加网关行_________________________ /// /// 添加行 /// /// String way. public void AddRowLayout(string strWayId) { //重复追加的时候(这个是别的画面调用的逻辑,自身不会出现这种情况) if (this.dicRowContr.ContainsKey(strWayId) == true) { var Gateway2 = LocalGateway.Current.GetLocalGateway(strWayId); if (Gateway2 != null) { this.dicRowContr[strWayId].zbGateway = Gateway2; this.dicRowContr[strWayId].RefreshControl(true); } return; } //网关控件 var Gateway = LocalGateway.Current.GetLocalGateway(strWayId); var gatewayRow = new GatewayViewRow(listview, Gateway); //向右图标 gatewayRow.AddRightIconControl(); //提示有新版本 var btnNew = new InformationTipView(gatewayRow.btnIcon); btnNew.Visible = false; gatewayRow.AddChidren(btnNew, ChidrenBindMode.BindEventOnly); gatewayRow.AddTag("btnNew", btnNew); this.dicRowContr[strWayId] = gatewayRow; //设置一个选择网关的默认值 if (string.IsNullOrEmpty(GatewayResourse.AppOldSelectGatewayId) == true && gatewayRow.IsOnline == true) { this.SaveGatewayIdToLocation(strWayId); } //编辑按钮 var btnEditor = new RowEditorButton(); gatewayRow.AddRightView(btnEditor); btnEditor.MouseUpEventHandler += (sender, e) => { //如果点击的是不在线的网关,则当什么事都没有发生 if (gatewayRow.IsOnline == false) { //指定的网关不在线 this.ShowNormalMsg(Language.StringByID(R.MyInternationalizationString.uTheGatewayIsNotOnline)); return; } //点击编辑的话,直接隐藏 btnNew.Visible = false; var form = new GatewayInfoEditorForm(); this.AddForm(form, Gateway); }; //解除绑定 var btnUnBind = new RowUnBindButton(); gatewayRow.AddRightView(btnUnBind); btnUnBind.MouseUpEventHandler += (sender, e) => { //确定要解除绑定的网关吗? string msg = Language.StringByID(R.MyInternationalizationString.uUnBindedMsg); this.ShowConfirmMsg(msg, "DeleteGateway", strWayId, gatewayRow); }; //单击事件 gatewayRow.MouseUpEvent += (sender, e) => { //如果点击的是不在线的网关,则当什么事都没有发生 if (gatewayRow.IsOnline == false) { //指定的网关不在线 this.ShowNormalMsg(Language.StringByID(R.MyInternationalizationString.uTheGatewayIsNotOnline)); return; } //如果存在新版本,并且单击他的话 if (btnNew.Visible == true) { if (sender is InformationTipView || sender is RowLeftIconView) { //打开编辑界面 btnNew.Visible = false; var form = new GatewayInfoEditorForm(); this.AddForm(form, Gateway); return; } } //是否切换到{0}网关? string msg = string.Format(Language.StringByID(R.MyInternationalizationString.uConfirmWantToSwitchTheGateway), "[" + gatewayRow.btnName.Text + "]"); if (strWayId == GatewayResourse.AppOldSelectGatewayId) { //是否重新刷新{0}网关? msg = string.Format(Language.StringByID(R.MyInternationalizationString.uConfirmWantToRefreshTheGateway), "[" + gatewayRow.btnName.Text + "]"); } this.ShowConfirmMsg(msg, "DoSwitchGateway", strWayId); }; } #endregion #region ■ 解绑网关___________________________ /// /// 解绑网关 /// /// /// public async void DeleteGateway(string strWayId, GatewayViewRow row) { //删除云端网关 bool result = await Common.LocalGateway.Current.DeleteGateway(strWayId); if (result == false) { return; } if (strWayId == GatewayResourse.AppOldSelectGatewayId) { //如果解除绑定的网关是当前所选择的网关的话,则关闭设备管理界面 this.closeDeviceManagForm = true; this.SaveGatewayIdToLocation(string.Empty); } Application.RunOnMainThread(() => { //移除 if (this.dicRowContr.ContainsKey(strWayId) == true) { this.dicRowContr.Remove(strWayId); } row.RemoveFromParent(); }); } #endregion #region ■ 网关切换___________________________ /// /// 执行切换网关操作 /// /// public async void DoSwitchGateway(string gatewayId) { //显示进度条 this.ShowProgressBar(); //获取网关 var gateway = Common.LocalGateway.Current.GetLocalGateway(gatewayId); //获取网关版本信息(包括镜像类型一起) var info = await Common.LocalGateway.Current.GetGatewayNewInfoAsync(gateway); if (info == null) { //关闭进度条 this.CloseProgressBar(); return; } //获取全部设备 bool result = await Common.LocalDevice.Current.SetDeviceToMemmoryByGateway(gateway); if (result == false) { //关闭进度条 this.CloseProgressBar(); return; } //切换网关,保存缓存 this.SaveGatewayIdToLocation(gatewayId); //如果选择了刷新的网关,则不关闭管理界面 this.closeDeviceManagForm = false; if (UserCenterResourse.DicActionForm.ContainsKey("DeviceManagementMainForm") == false) { Application.RunOnMainThread(() => { //刷新主画面 var form = new Device.DeviceManagementMainForm(); this.AddFromAndRemoveNowForm(form); }); } else { Application.RunOnMainThread(() => { //关闭界面 this.CloseForm(); //刷新主画面(不重新获取设备状态) this.LoadFormMethodByName("DeviceManagementMainForm", "InitMiddleFrame", false); }); } } /// /// 保存选择的网关ID到本地 /// /// private void SaveGatewayIdToLocation(string gatewayId) { GatewayResourse.AppOldSelectGatewayId = gatewayId; byte[] data = System.Text.Encoding.UTF8.GetBytes(Newtonsoft.Json.JsonConvert.SerializeObject(GatewayResourse.AppOldSelectGatewayId)); Global.WriteFileToDirectoryByBytes(DirNameResourse.LocalMemoryDirectory, DirNameResourse.AppOldSelectGatewayFile, data); } #endregion #region ■ 网关在线检测_______________________ /// /// 开启网关在线监测的线程 /// /// private void StartGatewayOnlieCheckThread(List listway) { new System.Threading.Thread(() => { System.Threading.Thread.Sleep(300); //刷新网关在线状态 Common.LocalGateway.Current.RefreshGatewayOnlineStatu(listway); foreach (var way in listway) { if (this.Parent == null) { return; } bool online = Common.LocalGateway.Current.CheckGatewayOnlineByFlag(way); this.GatewayOnlinePush(way, online); } //网关新版本检测 this.CheckGatewayNewVersion(listway); }) { IsBackground = true }.Start(); } /// /// 网关在线状态变更 /// /// 网关对象 /// 在线状态变更后的状态 public override void GatewayOnlinePush(ZbGateway gateWay, bool online) { Application.RunOnMainThread(() => { if (this.Parent == null) { return; } string gwid = Common.LocalGateway.Current.GetGatewayId(gateWay); if (this.dicRowContr.ContainsKey(gwid) == true) { this.dicRowContr[gwid].zbGateway = gateWay; this.dicRowContr[gwid].RefreshControl(online); } }); } #endregion #region ■ 网关新版本检测_____________________ /// /// 网关新版本检测 /// /// private async void CheckGatewayNewVersion(List listWays) { foreach (var way in listWays) { if (this.Parent == null) { return; } if (Common.LocalGateway.Current.CheckGatewayOnlineByFlag(way) == false) { //不在线的不用理它 continue; } //获取最新版本 var result = await Common.LocalGateway.Current.GetGatewayAllNewVersion(way, ShowErrorMode.NO); if (result == null) { continue; } if (result[0] != null || result[1] != null || result[2] != null) { //有新版本 string gwid = Common.LocalGateway.Current.GetGatewayId(way); Application.RunOnMainThread(() => { if (this.dicRowContr.ContainsKey(gwid) == true) { var btnNew = (InformationTipView)this.dicRowContr[gwid].GetTagByKey("btnNew"); btnNew.Visible = true; } }); } } } #endregion #region ■ 画面关闭___________________________ /// /// 画面关闭 /// /// 是否关闭界面,false的时候,只会调用关闭函数里面的附加功能 public override void CloseForm(bool isCloseForm = true) { //移除接受在线状态推送 this.RemoveGatewayOnlinePush(); base.CloseForm(isCloseForm); if (string.IsNullOrEmpty(GatewayResourse.AppOldSelectGatewayId) == true && this.closeDeviceManagForm == true) { //关闭界面 Common.LocalGateway.Current.RefreshAppOldSelectGatewayId(); this.LoadFormMethodByName("DeviceManagementMainForm", "CloseForm", true); } //if (UserCenterResourse.DicActionForm.ContainsKey("DeviceManagementMainForm") == false // && string.IsNullOrEmpty(GatewayResourse.AppOldSelectGatewayId) == false) //{ // //打开设备管理界面 // var form = new Device.DeviceManagementMainForm(); // this.AddForm(form); //} } #endregion } }