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
}
}