using System; using System.Collections.Generic; using System.Text; using System.Threading.Tasks; using ZigBee.Device; namespace Shared.Phone.UserCenter.SharedContent { /// /// 查看已共享内容的房间列表界面 /// public class SearchConfigureSharedListRoomForm : UserCenterCommonForm { #region ■ 变量声明___________________________ /// /// 列表控件 /// private VerticalScrolViewLayout listView = null; /// /// 成员信息 /// private MemberInfoRes memberResult = null; /// /// 成员的分享数据 /// private MemberShardInfoData memberShardInfo = null; #endregion #region ■ 初始化_____________________________ /// /// 画面显示(底层会固定调用此方法,借以完成画面创建) /// /// 成员信息 /// 成员的共享信息 public void ShowForm(MemberInfoRes i_memberResult, MemberShardInfoData i_memberShardInfo) { this.memberResult = i_memberResult; this.memberShardInfo = i_memberShardInfo; this.memberShardInfo.SubAccountDistributedMark = this.memberResult.SubAccountDistributedMark; //设置头部信息 base.SetTitleText(Language.StringByID(R.MyInternationalizationString.uHadSharedContent)); //添加图标 var btnAdd = new TopLayoutMostRightView(); btnAdd.UnSelectedImagePath = "Item/Add.png"; btnAdd.SelectedImagePath = "Item/AddSelected.png"; btnAdd.MouseUpEventHandler += (sender, e) => { var form = new ConfigureNewSharedListRoomForm(); base.AddForm(form, this.memberResult, this.memberShardInfo); }; topFrameLayout.AddChidren(btnAdd); //初始化中部信息 this.InitMiddleFrame(); } /// /// 初始化中部信息 /// private void InitMiddleFrame() { bodyFrameLayout.RemoveAll(); //区域列表 var btnTitle = new TitleViewControl(1000, true); btnTitle.TextID = R.MyInternationalizationString.uAreaList; btnTitle.Y = Application.GetRealHeight(30); bodyFrameLayout.AddChidren(btnTitle); this.listView = new VerticalScrolViewLayout(); listView.Y = btnTitle.Bottom + Application.GetRealHeight(30); listView.Height = bodyFrameLayout.Height - Application.GetRealHeight(30) - btnTitle.Bottom; bodyFrameLayout.AddChidren(listView); new System.Threading.Thread(async () => { //获取成员的共享列表(返回文件的名字和主键) var result = await this.GetMemberShardContentListAndSetToLocation(); if (result == false) { return; } //从本地获取成员的分享列表 this.GetMemberShardContentListFromLocal(); //初始化区域列表 this.InitAreaListRow(); }) { IsBackground = true }.Start(); } #endregion #region ■ 区域列表___________________________ /// /// 初始化区域列表 /// private void InitAreaListRow() { if (memberShardInfo.dicShardRoom.Count == 0) { Application.RunOnMainThread(() => { bodyFrameLayout.RemoveAll(); //请配置共享设备 var btnMsg = new MsgViewControl(bodyFrameLayout.Width, false); btnMsg.Gravity = Gravity.CenterVertical; btnMsg.TextID = R.MyInternationalizationString.uPleaseConfigureShardDeviceMsg; bodyFrameLayout.AddChidren(btnMsg); }); return; } foreach (var room in memberShardInfo.dicShardRoom.Values) { Application.RunOnMainThread(() => { this.AddRoomRow(room); }); } } /// /// 添加房间行 /// /// private void AddRoomRow(Common.Room room) { var row = new StatuRowLayout(listView); //房间名 var btnName = new RowCenterView(false); btnName.Text = room.Name; row.AddChidren(btnName); var btnDelete = new RowDeleteButton(); row.AddRightView(btnDelete); btnDelete.MouseUpEventHandler += (sender, e) => { //确定移除该共享区域? string msg = Language.StringByID(R.MyInternationalizationString.uDeleteShardAreaMsg); this.ShowConfirmMsg(msg, "DoDeleteShardContentByRoom", room); }; row.AddRightIconControl(); row.MouseUpEvent += (sender, e) => { var form = new SearchConfigureSharedMainForm(); this.AddForm(form, room, memberResult, memberShardInfo); }; } #endregion #region ■ 删除共享区域_______________________ /// /// 删除共享区域 /// /// 指定要删除的共享区域 public void DoDeleteShardContentByRoom(Common.Room room) { //获取全部设备 var listDevice = new List(); foreach (var deviceUi in room.DeviceUIList) { var device = deviceUi.CommonDevice; if (device == null) { var byteData = HdlShardLogic.Current.GetShardFileContent(deviceUi.DeviceFileName); if (byteData == null) { continue; } device = Newtonsoft.Json.JsonConvert.DeserializeObject(System.Text.Encoding.UTF8.GetString(byteData)); } listDevice.Add(device); } //获取全部场景 var listScene = new List(); foreach (var sceneUi in room.SceneUIList) { listScene.Add(sceneUi); } new System.Threading.Thread(async () => { //执行删除 var result = await HdlShardLogic.Current.DoDeleteSharedContent(memberShardInfo, room, listDevice, listScene); if (result == true) { Application.RunOnMainThread(() => { //重新刷新界面 this.InitMiddleFrame(); }); } }) { IsBackground = true }.Start(); } #endregion #region ■ 获取成员共享列表___________________ /// /// 获取成员共享列表然后保存到本地 /// /// private async Task GetMemberShardContentListAndSetToLocation() { if (this.memberShardInfo.Refresh == false) { return true; } this.memberShardInfo.Refresh = false; //开启进度条 this.ShowProgressBar(); var infoPra = new { DistributedMark = memberResult.SubAccountDistributedMark, HouseDistributedMark = Shared.Common.Config.Instance.HomeId, IsOtherAccountControl = Common.Config.Instance.isAdministrator }; var result = await UserCenterLogic.GetResponseDataByRequestHttps("ZigbeeDataShare/GetShareDataBySubAccount", infoPra); if (result == null) { //关闭进度条 this.CloseProgressBar(ShowReLoadMode.YES); return false; } var listData = Newtonsoft.Json.JsonConvert.DeserializeObject>(result); //先清空共享文件夹 HdlShardLogic.Current.ClearShardDirectory(); var listMark = new List(); foreach (var data in listData) { //性能优化:如果本地拥有这个文件的话,直接使用那个文件 string fileName = data.ShareName; //记录起它的主键 memberShardInfo.dicAllShardKeys[fileName] = data.DistributedMark; if (fileName.StartsWith("Room_") == true || fileName.StartsWith("Scene_") == true) { //房间文件和场景文件需要重新反序列化 listMark.Add(data.DistributedMark); continue; } if (Shared.Common.Global.IsExistsByHomeId(fileName) == true) { //其他文件的话,如果本地存在,则以本地文件为准 HdlShardLogic.Current.AddShardFile(fileName); continue; } listMark.Add(data.DistributedMark); } //将分享的数据存入本地,返回的是文件名字(异常时返回null) var listFile = await HdlShardLogic.Current.SetShardFileToLocation(listMark); if (listFile == null) { //关闭进度条 this.CloseProgressBar(ShowReLoadMode.YES); return false; } //关闭进度条 this.CloseProgressBar(); return true; } /// /// 从本地获取成员的分享列表 /// private void GetMemberShardContentListFromLocal() { memberShardInfo.dicShardRoom = new Dictionary(); var listFile = HdlShardLogic.Current.GetLocalAllShardFile(); foreach (string fileName in listFile) { if (fileName.StartsWith("Room_") == true) { var byteData = HdlShardLogic.Current.GetShardFileContent(fileName); if (byteData == null) { continue; } string valueData = System.Text.Encoding.UTF8.GetString(byteData); var roomTemp = Newtonsoft.Json.JsonConvert.DeserializeObject(valueData); memberShardInfo.dicShardRoom[fileName] = roomTemp; if (memberShardInfo.dicAllMemberShard.ContainsKey(fileName) == false) { //先初始化房间 memberShardInfo.dicAllMemberShard[fileName] = new HashSet(); } } } //设置房间里面设备的UI对象(因为这个东西是反序列化出来的,设备UI对象是不序列化对象) this.InitRoomAttributeData(); } /// /// 初始化房间的属性对象全部的本地文件 /// private void InitRoomAttributeData() { //设置房间里面设备的UI对象(因为这个东西是反序列化出来的,设备UI对象是不序列化对象) foreach (var tempRoom in memberShardInfo.dicShardRoom.Values) { var listShard = memberShardInfo.dicAllMemberShard[tempRoom.FileName]; listShard.Clear(); //添加房间 listShard.Add(tempRoom.FileName); //还原UI设备对象 tempRoom.DeviceUIList.Clear(); foreach (string uiPath in tempRoom.DeviceUIFilePathList) { var byteData = HdlShardLogic.Current.GetShardFileContent(uiPath); if (byteData == null) { continue; } string valueData = System.Text.Encoding.UTF8.GetString(byteData); var tempUi = Newtonsoft.Json.JsonConvert.DeserializeObject(valueData); tempRoom.DeviceUIList.Add(tempUi); //设备UI listShard.Add(tempUi.FileName); //设备 listShard.Add(tempUi.DeviceFileName); } //还原场景对象 tempRoom.SceneUIList.Clear(); foreach (string uiPath in tempRoom.SceneUIFilePathList) { var byteData = HdlShardLogic.Current.GetShardFileContent(uiPath); if (byteData == null) { continue; } string valueData = System.Text.Encoding.UTF8.GetString(byteData); var tempUi = Newtonsoft.Json.JsonConvert.DeserializeObject(valueData); tempRoom.SceneUIList.Add(tempUi); //场景的主键 listShard.Add(tempUi.FileName); //从场景对象里面获取全部的绑定目标的文件名字 this.GetSceneBindFileName(tempUi, ref listShard); } } } #endregion #region ■ 界面重新激活事件___________________ /// /// 自身的上层界面关闭后,它自身处于最上层时,触发的事件 /// public override void FormActionAgainEvent() { //重新刷新界面 this.InitMiddleFrame(); } #endregion #region ■ 一般方法___________________________ /// /// 从场景对象里面获取全部的绑定目标的文件名字 /// /// 场景 /// 文件列表(里面存的是设备UI文件和设备文件和场景文件) private void GetSceneBindFileName(Common.SceneUI scene, ref HashSet listFile) { foreach (var data in scene.AddSceneMemberDataList) { //设备 if (data.Type == 0) { var device = Common.LocalDevice.Current.GetDevice(data.DeviceAddr, data.Epoint); if (device != null) { string uiName = "DeviceUI_" + device.FilePath; if (listFile.Contains(uiName) == false) { listFile.Add(uiName); listFile.Add(device.FilePath); } } } if (data.Type == 1) { var sceneTemp = Common.Room.CurrentRoom.GetSceneUIBySceneId(data.ElseScenesId); if (sceneTemp != null && listFile.Contains(sceneTemp.FileName)) { listFile.Add(sceneTemp.FileName); } } } } #endregion #region ■ 结构体_____________________________ /// /// 接收分享数据 /// private class ReceiveShardInfoResult { /// /// 文件名字 /// public string ShareName = string.Empty; /// /// 主键 /// public string DistributedMark = string.Empty; } #endregion } }