using System;
|
using System.Collections.Generic;
|
using System.Text;
|
using System.Threading.Tasks;
|
using ZigBee.Device;
|
|
namespace Shared.Phone.UserCenter.SharedContent
|
{
|
/// <summary>
|
/// 查看已共享内容的房间列表界面
|
/// </summary>
|
public class SearchConfigureSharedListRoomForm : UserCenterCommonForm
|
{
|
#region ■ 变量声明___________________________
|
|
/// <summary>
|
/// 列表控件
|
/// </summary>
|
private VerticalScrolViewLayout listView = null;
|
/// <summary>
|
/// 成员信息
|
/// </summary>
|
private MemberInfoRes memberResult = null;
|
/// <summary>
|
/// 成员的分享数据
|
/// </summary>
|
private MemberShardInfoData memberShardInfo = null;
|
|
#endregion
|
|
#region ■ 初始化_____________________________
|
|
/// <summary>
|
/// 画面显示(底层会固定调用此方法,借以完成画面创建)
|
/// </summary>
|
/// <param name="i_memberResult">成员信息</param>
|
/// <param name="i_memberShardInfo">成员的共享信息</param>
|
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();
|
}
|
|
/// <summary>
|
/// 初始化中部信息
|
/// </summary>
|
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 ■ 区域列表___________________________
|
|
/// <summary>
|
/// 初始化区域列表
|
/// </summary>
|
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);
|
});
|
}
|
}
|
|
/// <summary>
|
/// 添加房间行
|
/// </summary>
|
/// <param name="room"></param>
|
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 ■ 删除共享区域_______________________
|
|
/// <summary>
|
/// 删除共享区域
|
/// </summary>
|
/// <param name="room">指定要删除的共享区域</param>
|
public void DoDeleteShardContentByRoom(Common.Room room)
|
{
|
//获取全部设备
|
var listDevice = new List<CommonDevice>();
|
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<CommonDevice>(System.Text.Encoding.UTF8.GetString(byteData));
|
}
|
listDevice.Add(device);
|
}
|
//获取全部场景
|
var listScene = new List<Common.SceneUI>();
|
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 ■ 获取成员共享列表___________________
|
|
/// <summary>
|
/// 获取成员共享列表然后保存到本地
|
/// </summary>
|
/// <returns></returns>
|
private async Task<bool> 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<List<ReceiveShardInfoResult>>(result);
|
//先清空共享文件夹
|
HdlShardLogic.Current.ClearShardDirectory();
|
|
var listMark = new List<string>();
|
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;
|
}
|
|
/// <summary>
|
/// 从本地获取成员的分享列表
|
/// </summary>
|
private void GetMemberShardContentListFromLocal()
|
{
|
memberShardInfo.dicShardRoom = new Dictionary<string, Common.Room>();
|
|
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<Common.Room>(valueData);
|
memberShardInfo.dicShardRoom[fileName] = roomTemp;
|
|
if (memberShardInfo.dicAllMemberShard.ContainsKey(fileName) == false)
|
{
|
//先初始化房间
|
memberShardInfo.dicAllMemberShard[fileName] = new HashSet<string>();
|
}
|
}
|
}
|
//设置房间里面设备的UI对象(因为这个东西是反序列化出来的,设备UI对象是不序列化对象)
|
this.InitRoomAttributeData();
|
}
|
|
/// <summary>
|
/// 初始化房间的属性对象全部的本地文件
|
/// </summary>
|
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<Common.DeviceUI>(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<Common.SceneUI>(valueData);
|
tempRoom.SceneUIList.Add(tempUi);
|
|
//场景的主键
|
listShard.Add(tempUi.FileName);
|
//从场景对象里面获取全部的绑定目标的文件名字
|
this.GetSceneBindFileName(tempUi, ref listShard);
|
}
|
}
|
}
|
|
#endregion
|
|
#region ■ 界面重新激活事件___________________
|
|
/// <summary>
|
/// 自身的上层界面关闭后,它自身处于最上层时,触发的事件
|
/// </summary>
|
public override void FormActionAgainEvent()
|
{
|
//重新刷新界面
|
this.InitMiddleFrame();
|
}
|
|
#endregion
|
|
#region ■ 一般方法___________________________
|
|
/// <summary>
|
/// 从场景对象里面获取全部的绑定目标的文件名字
|
/// </summary>
|
/// <param name="scene">场景</param>
|
/// <param name="listFile">文件列表(里面存的是设备UI文件和设备文件和场景文件)</param>
|
private void GetSceneBindFileName(Common.SceneUI scene, ref HashSet<string> 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 ■ 结构体_____________________________
|
|
/// <summary>
|
/// 接收分享数据
|
/// </summary>
|
private class ReceiveShardInfoResult
|
{
|
/// <summary>
|
/// 文件名字
|
/// </summary>
|
public string ShareName = string.Empty;
|
/// <summary>
|
/// 主键
|
/// </summary>
|
public string DistributedMark = string.Empty;
|
}
|
|
#endregion
|
}
|
}
|