using System; using System.Collections.Generic; using System.Text; using System.Threading.Tasks; using ZigBee.Device; namespace Shared.Phone.UserCenter.SharedContent { /// /// 查看已共享内容的房间列表界面★ /// public class SearchConfigureSharedListRoomForm : EditorCommonForm { #region ■ 变量声明___________________________ /// /// 列表控件 /// private VerticalFrameControl 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.uShared2)); //添加图标 var btnAdd = new MostRightIconControl(69, 69); btnAdd.UnSelectedImagePath = "Item/Add.png"; btnAdd.ButtonClickEvent += (sender, e) => { var form = new ConfigureNewSharedListRoomForm(); form.AddForm(this.memberResult, this.memberShardInfo); }; topFrameLayout.AddChidren(btnAdd); btnAdd.InitControl(); //初始化中部信息 this.InitMiddleFrame(); } /// /// 初始化中部信息 /// private void InitMiddleFrame() { //清空bodyFrame this.ClearBodyFrame(); HdlThreadLogic.Current.RunThread(async () => { //获取成员的共享列表 var result = await this.GetMemberShardContentListAndSetToLocation(); if (result == false) { return; } //从本地获取成员的分享列表 this.GetMemberShardContentListFromLocal(); //初始化区域列表 this.InitAreaListRow(); }); } #endregion #region ■ 区域列表___________________________ /// /// 初始化区域列表 /// private void InitAreaListRow() { if (memberShardInfo.dicShardRoom.Count == 0) { HdlThreadLogic.Current.RunMain(() => { //显示没有分享数据模式 this.ShowNotShardMode(); }); } else { //合并同一楼层的房间 var dicGroup = new Dictionary>(); foreach (var room in memberShardInfo.dicShardRoom.Values) { if (dicGroup.ContainsKey(room.FloorId) == false) { dicGroup[room.FloorId] = new List(); } dicGroup[room.FloorId].Add(room); } HdlThreadLogic.Current.RunMain(() => { bodyFrameLayout.RemoveAll(); this.listView = new VerticalFrameControl(29); listView.Height = bodyFrameLayout.Height; bodyFrameLayout.AddChidren(listView); //添加各自楼层的房间列表 foreach (var floorId in dicGroup.Keys) { this.AddRoomListRow(floorId, dicGroup[floorId]); } }); } } /// /// 添加房间列表行 /// /// private void AddRoomListRow(string floorId, List listRoom) { var frameBack = new FrameListControl(29); frameBack.BackgroundColor = UserCenterColor.Current.White; frameBack.Height = 10; this.listView.AddChidrenFrame(frameBack); //楼层 if (string.IsNullOrEmpty(floorId) == false) { var btnFloor = new NormalViewControl(800, 60, true); btnFloor.X = ControlCommonResourse.XXLeft; btnFloor.Y = Application.GetRealHeight(52); btnFloor.TextColor = UserCenterColor.Current.TextColor2; btnFloor.TextSize = 15; frameBack.AddChidren(btnFloor); if (memberShardInfo.dicShardFloor.ContainsKey(floorId) == true) { btnFloor.Text = memberShardInfo.dicShardFloor[floorId]; } else { btnFloor.Text = "UnKnown"; } } for (int i = 0; i < listRoom.Count; i++) { var room = listRoom[i]; var frameRow = new RowLayoutControl(frameBack.rowSpace / 2); frameBack.AddChidren(frameRow); //图标 var btnIcon = frameRow.frameTable.AddLeftIcon(81); btnIcon.UnSelectedImagePath = "Item/RoomIcon.png"; //名称 var btnName = frameRow.frameTable.AddLeftCaption(room.Name, 600); btnName.TextSize = 15; //右箭头 frameRow.frameTable.AddRightArrow(); if (i != listRoom.Count - 1) { //底线 frameRow.frameTable.AddBottomLine(); } frameRow.frameTable.ButtonClickEvent += (sender, e) => { }; //删除 var btnDelete = new NormalViewControl(Application.GetRealWidth(184), frameRow.Height, false); btnDelete.BackgroundColor = 0xfff75858; btnDelete.TextSize = 12; btnDelete.TextColor = UserCenterColor.Current.White; btnDelete.TextAlignment = TextAlignment.Center; btnDelete.TextID = R.MyInternationalizationString.uDelete; frameRow.AddRightView(btnDelete); btnDelete.ButtonClickEvent += (sender, e) => { //确认删除共享房间? string msg = Language.StringByID(R.MyInternationalizationString.uDeleteShardRoomMsg); this.ShowMassage(ShowMsgType.Confirm, msg, () => { //删除共享区域 this.DoDeleteShardContentByRoom(room); }); }; } //调整子控件Frame高度 this.listView.AdjustChidrenFrameHeight(frameBack, Application.GetRealHeight(29)); } #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) { string deviceFile = deviceUi.FileName.Replace("DeviceUI_", string.Empty); var byteData = HdlShardLogic.Current.GetShardFileContent(deviceFile); 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); } HdlThreadLogic.Current.RunThread(async () => { //执行删除 var result = await HdlShardLogic.Current.DoDeleteSharedContent(memberShardInfo, room, listDevice, listScene); if (result == true) { HdlThreadLogic.Current.RunMain(() => { //重新刷新界面 this.InitMiddleFrame(); }); } }); } #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", false, 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(); //设备文件(分享的,而不是本地的) var dicDeviceFile = new Dictionary(); //先初始化房间 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(); } } else if (fileName.StartsWith("Device_") == true) { //设备文件 string[] MyArry = fileName.Split(new string[] { "_" }, StringSplitOptions.RemoveEmptyEntries); if (MyArry.Length == 4) { string mainKeys = Common.LocalDevice.Current.GetDeviceMainKeys(MyArry[2], Convert.ToInt32(MyArry[3])); dicDeviceFile[mainKeys] = fileName; } } } //设置房间里面设备的UI对象(因为这个东西是反序列化出来的,设备UI对象是不序列化对象) foreach (var tempRoom in memberShardInfo.dicShardRoom.Values) { var listShard = memberShardInfo.dicAllMemberShard[tempRoom.FileName]; listShard.Clear(); //添加房间 listShard.Add(tempRoom.FileName); //还原设备对象 tempRoom.DeviceUIList.Clear(); foreach (string uiPath in tempRoom.DeviceUIFilePathList) { string deviceFile = uiPath.Replace("DeviceUI_", string.Empty); if (HdlShardLogic.Current.IsFileExists(deviceFile) == false) { continue; } tempRoom.DeviceUIList.Add(Common.LocalDevice.Current.GetDeviceUI(uiPath)); //设备 listShard.Add(deviceFile); } //还原场景对象 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, dicDeviceFile, ref listShard); } } } /// /// 从场景对象里面获取全部的绑定目标的文件名字 /// /// 场景 /// 分享的设备文件 /// 文件列表(里面存的是设备UI文件和设备文件和场景文件) private void GetSceneBindFileName(Common.SceneUI scene, Dictionary dicDeviceFile, ref HashSet listFile) { foreach (var data in scene.AddSceneMemberDataList) { //设备 if (data.Type == 0) { var mainKeys = Common.LocalDevice.Current.GetDeviceMainKeys(data.DeviceAddr, data.Epoint); if (dicDeviceFile.ContainsKey(mainKeys) == true && listFile.Contains(dicDeviceFile[mainKeys]) == false) { listFile.Add(dicDeviceFile[mainKeys]); } } if (data.Type == 1) { var sceneTemp = new Common.SceneUI(); sceneTemp.Id = data.ElseScenesId; if (listFile.Contains(sceneTemp.FileName)) { listFile.Add(sceneTemp.FileName); } } } } #endregion #region ■ 界面重新激活事件___________________ /// /// 自身的上层界面关闭后,它自身处于最上层时,触发的事件 /// public override int FormActionAgainEvent() { //重新刷新界面 this.InitMiddleFrame(); return 1; } #endregion #region ■ 一般方法___________________________ /// /// 显示没有分享数据模式 /// private void ShowNotShardMode() { bodyFrameLayout.RemoveAll(); //图片 var btnPic = new PicViewControl(383, 279); btnPic.Gravity = Gravity.CenterHorizontal; btnPic.Y = Application.GetRealHeight(498); btnPic.UnSelectedImagePath = "Item/NotShardPic.png"; bodyFrameLayout.AddChidren(btnPic); //还没有共享区域给成员{0}可点击右上角“+”添加 string msg = Language.StringByID(R.MyInternationalizationString.uNotShardComtentMsg); string[] Arry = msg.Split(new string[] { "{0}" }, StringSplitOptions.RemoveEmptyEntries); var btnMsg1 = new NormalViewControl(bodyFrameLayout.Width, Application.GetRealHeight(50), false); btnMsg1.Y = Application.GetRealHeight(962); btnMsg1.TextAlignment = TextAlignment.Center; btnMsg1.TextSize = 12; btnMsg1.TextColor = UserCenterColor.Current.TextGrayColor1; btnMsg1.Text = Arry[0]; bodyFrameLayout.AddChidren(btnMsg1); if (Arry.Length > 1) { var btnMsg2 = new NormalViewControl(bodyFrameLayout.Width, Application.GetRealHeight(50), false); btnMsg2.Y = btnMsg1.Bottom; btnMsg2.TextAlignment = TextAlignment.Center; btnMsg2.TextSize = 12; btnMsg2.TextColor = UserCenterColor.Current.TextGrayColor1; btnMsg2.Text = Arry[1]; bodyFrameLayout.AddChidren(btnMsg2); } } #endregion #region ■ 结构体_____________________________ /// /// 接收分享数据 /// private class ReceiveShardInfoResult { /// /// 文件名字 /// public string ShareName = string.Empty; /// /// 主键 /// public string DistributedMark = string.Empty; } #endregion } }