using Shared.Common;
using System;
using System.Collections.Generic;
namespace Shared.Phone.UserCenter.Residence
{
///
/// 住宅管理的画面★
///
public class ResidenceListForm : EditorCommonForm
{
#region ■ 变量声明___________________________
///
/// 列表控件
///
private VerticalListControl listView = null;
///
/// 住宅数据(有网时使用)
///
private Dictionary dicResidenceData = null;
///
/// 住宅数据(无网时使用)
///
private List listLocalHouse = null;
#endregion
#region ■ 初始化_____________________________
///
/// 画面显示(底层会固定调用此方法,借以完成画面创建)
///
public void ShowForm()
{
//设置标题信息
base.SetTitleText(Language.StringByID(R.MyInternationalizationString.ResidenceManagement));
//虚拟住宅无法新建住宅
if (Common.Config.Instance.Home.IsVirtually == false)
{
//右上添加按钮
var btnTopIcon = new MostRightIconControl(69, 69);
btnTopIcon.UnSelectedImagePath = "Item/Add.png";
topFrameLayout.AddChidren(btnTopIcon);
btnTopIcon.InitControl();
btnTopIcon.ButtonClickEvent += (sender, e) =>
{
//显示添加住宅名称的画面
this.ShowAddNameForm();
};
}
//初始化中部控件
this.InitMiddleFrame();
}
///
/// 初始化中部控件
///
private void InitMiddleFrame()
{
//清空bodyFrame
this.ClearBodyFrame();
listView = new VerticalListControl(29);
listView.Height = bodyFrameLayout.Height + Application.GetRealHeight(6);
listView.BackgroundColor = UserCenterColor.Current.White;
bodyFrameLayout.AddChidren(listView);
//设置住宅信息
this.SetResidenceInfo(1);
}
///
/// 设置住宅信息(1:先读取云端,无法联网,再读取本地 2:只读云端 3:只读本地)
///
/// 1:先读取云端,无法联网,再读取本地 2:只读云端 3:只读本地
private void SetResidenceInfo(int div)
{
HdlThreadLogic.Current.RunThread(async () =>
{
//虚拟住宅的话,只读本地
if (div == 3 || Config.Instance.Home.IsVirtually == true)
{
//只读本地
this.SetResidenceInfoByOffline();
}
else
{
//开启进度条
this.ShowProgressBar();
//设置住宅信息(有网情况)
var result = await this.SetResidenceInfoByOnline();
if (result == true)
{
//云端读取成功
this.CloseProgressBar();
return;
}
if (div == 2)
{
//如果只读云端 关闭进度条
this.CloseProgressBar(ShowReLoadMode.YES);
return;
}
//如果在没网的情况下,从文件夹路径中获取全部住宅,然后显示
this.SetResidenceInfoByOffline();
//关闭进度条
this.CloseProgressBar();
}
});
}
#endregion
#region ■ 设置住宅信息(有网情况)_____________
///
/// 设置住宅信息(有网情况)
///
private async System.Threading.Tasks.Task SetResidenceInfoByOnline()
{
//获取住宅信息
var Pra = new GetResidenceInfoPra();
var listNotCheck = new List() { "NotSetAgain" };
string resultData = await UserCenterLogic.GetResponseDataByRequestHttps("App/GetHomePager", false, Pra, listNotCheck);
if (resultData == null)
{
return false;
}
var pageData = Newtonsoft.Json.JsonConvert.DeserializeObject(resultData);
//暂时存储数据
var dicData = new Dictionary();
var listResidenceSort = new List();
for (int i = 0; i < pageData.PageData.Count; i++)
{
dicData[pageData.PageData[i].Id] = pageData.PageData[i];
listResidenceSort.Add(pageData.PageData[i].Id);
}
HdlThreadLogic.Current.RunMain(() =>
{
if (this.Parent == null)
{
return;
}
listView.Height = bodyFrameLayout.Height;
this.dicResidenceData = new Dictionary();
for (int i = 0; i < listResidenceSort.Count; i++)
{
if (dicData.ContainsKey(listResidenceSort[i]) == false)
{
continue;
}
var info = dicData[listResidenceSort[i]];
//收集该账号住宅的数据
this.dicResidenceData[info.Id] = info;
//添加住宅的行(有网情况)
this.AddRowLayoutByOnline(info, i != listResidenceSort.Count - 1);
}
//调整列表控件的高度
this.listView.AdjustRealHeight(Application.GetRealHeight(23));
});
return true;
}
///
/// 添加住宅的行(有网情况)
///
///
private void AddRowLayoutByOnline(Common.ResponseEntity.ResidenceObj info, bool addLine)
{
var rowLayout = new RowLayoutControl(listView.rowSpace / 2);
this.listView.AddChidren(rowLayout);
//图标
var btnIcon = rowLayout.frameTable.AddLeftIcon(81);
btnIcon.UnSelectedImagePath = "Item/ResidenceIcon.png";
//当前住宅
NormalViewControl btnHome = null;
if (info.Id == Config.Instance.Home.Id)
{
//住宅名称
btnHome = rowLayout.frameTable.AddLeftCaption(info.Name, 800, 60, true);
btnHome.TextSize = 15;
btnHome.Y = Application.GetRealHeight(12) + rowLayout.chidrenYaxis;
rowLayout.frameTable.AddChidren(btnHome, ChidrenBindMode.BindEvent);
//当前住宅
var btnNowView = rowLayout.frameTable.AddLeftCaption(Language.StringByID(R.MyInternationalizationString.uNowResidence), 800, 49, true);
btnNowView.Y = Application.GetRealHeight(72) + rowLayout.chidrenYaxis;
btnNowView.TextSize = 12;
btnNowView.TextColor = UserCenterColor.Current.TextGrayColor1;
rowLayout.frameTable.AddChidren(btnNowView, ChidrenBindMode.BindEvent);
}
else
{
//住宅名称
btnHome = rowLayout.frameTable.AddLeftCaption(info.Name, 800, true);
btnHome.TextSize = 15;
}
//右箭头
rowLayout.frameTable.AddRightArrow();
if (addLine == true)
{
//底线
rowLayout.frameTable.AddBottomLine();
}
rowLayout.frameTable.ButtonClickEvent += (sender, e) =>
{
if (info.Id != Config.Instance.Home.Id)
{
//确认切换当前住宅到「」?
string msg = Language.StringByID(R.MyInternationalizationString.uSwitchResidenceMsg);
if (msg.Contains("{0}") == true)
{
msg = string.Format(msg, info.Name);
}
this.ShowMassage(ShowMsgType.Confirm, msg, () =>
{
HdlThreadLogic.Current.RunThread(async () =>
{
//开启进度条
this.ShowProgressBar();
//检测本地有没有这个住宅
this.CheckIsExsitResidence(info);
await HdlResidenceLogic.Current.SwitchResidence(info.Id);
HdlThreadLogic.Current.RunMain(() =>
{
//重新刷新列表
this.listView.RemoveAll();
this.SetResidenceInfo(2);
//关闭进度条
this.CloseProgressBar();
});
});
});
}
else
{
//检测能否删除住宅
bool flage = this.CheckIsCanDeleteResidence(info);
var form = new ResidenceManagementForm();
form.AddForm(flage);
}
};
if (info.IsOthreShare == true)
{
//分享的,不能更改
return;
}
//更改
var btnChanged = rowLayout.AddEditorControl();
btnChanged.TextID = R.MyInternationalizationString.uChanged1;
btnChanged.ButtonClickEvent += (sender, e) =>
{
//显示编辑名称界面
this.ShowEditorNameForm(info, null, btnHome);
};
}
#endregion
#region ■ 设置住宅信息(无网情况)_____________
///
/// 设置住宅信息(无网情况)
///
private void SetResidenceInfoByOffline()
{
//从文件夹中获取全部的住宅对象
this.listLocalHouse = HdlResidenceLogic.Current.GetAllLocalResidenceListByDirectory();
if (listLocalHouse.Count == 0)
{
return;
}
HdlThreadLogic.Current.RunMain(() =>
{
listView.Height = bodyFrameLayout.Height;
for (int i = 0; i < listLocalHouse.Count; i++)
{
//添加住宅的行(无网情况)
this.AddRowLayoutByOffline(listLocalHouse[i], i != listLocalHouse.Count - 1);
}
//调整列表控件的高度
this.listView.AdjustRealHeight(Application.GetRealHeight(23));
});
}
///
/// 添加住宅的行(无网情况)
///
///
private void AddRowLayoutByOffline(House i_home, bool addLine)
{
var rowLayout = new RowLayoutControl(listView.rowSpace / 2);
this.listView.AddChidren(rowLayout);
//图标
var btnIcon = rowLayout.frameTable.AddLeftIcon(81);
btnIcon.UnSelectedImagePath = "Item/ResidenceIcon.png";
//当前住宅
NormalViewControl btnHome = null;
if (i_home.Id == Config.Instance.Home.Id)
{
//住宅名称
btnHome = rowLayout.frameTable.AddLeftCaption(i_home.Name, 800, 60, true);
btnHome.TextSize = 15;
btnHome.Y = Application.GetRealHeight(12) + rowLayout.chidrenYaxis;
rowLayout.frameTable.AddChidren(btnHome, ChidrenBindMode.BindEvent);
//当前住宅
var btnNowView = rowLayout.frameTable.AddLeftCaption(Language.StringByID(R.MyInternationalizationString.uNowResidence), 800, 49, true);
btnNowView.Y = Application.GetRealHeight(72) + rowLayout.chidrenYaxis;
btnNowView.TextSize = 12;
btnNowView.TextColor = UserCenterColor.Current.TextGrayColor1;
rowLayout.frameTable.AddChidren(btnNowView, ChidrenBindMode.BindEvent);
}
else
{
//住宅名称
btnHome = rowLayout.frameTable.AddLeftCaption(i_home.Name, 800, true);
btnHome.TextSize = 15;
}
//右箭头
rowLayout.frameTable.AddRightArrow();
if (addLine == true)
{
//底线
rowLayout.frameTable.AddBottomLine();
}
rowLayout.frameTable.ButtonClickEvent += (sender, e) =>
{
if (i_home.Id != Config.Instance.Home.Id)
{
//确认切换当前住宅到「」?
string msg = Language.StringByID(R.MyInternationalizationString.uSwitchResidenceMsg);
if (msg.Contains("{0}") == true)
{
msg = string.Format(msg, i_home.Name);
}
this.ShowMassage(ShowMsgType.Confirm, msg, () =>
{
HdlThreadLogic.Current.RunThread(async () =>
{
await HdlResidenceLogic.Current.SwitchResidence(i_home.Id);
HdlThreadLogic.Current.RunMain(() =>
{
//重新刷新列表
this.listView.RemoveAll();
this.SetResidenceInfo(3);
//关闭进度条
this.CloseProgressBar();
});
});
});
}
else
{
//检测能否删除住宅
bool flage = this.CheckIsCanDeleteResidence(i_home);
var form = new ResidenceManagementForm();
form.AddForm(flage);
}
};
//更改
var btnChanged = rowLayout.AddEditorControl();
btnChanged.TextID = R.MyInternationalizationString.uChanged1;
btnChanged.ButtonClickEvent += (sender, e) =>
{
//显示编辑名称界面
this.ShowEditorNameForm(null, i_home, btnHome);
};
}
#endregion
#region ■ 编辑住宅名称_______________________
///
/// 显示编辑住宅名称界面
///
/// 有网时使用
/// 无网时适用
private void ShowEditorNameForm(Common.ResponseEntity.ResidenceObj info, House i_house, NormalViewControl btnHome)
{
string oldName = info != null ? info.Name : i_house.Name;
//生成一个弹窗画面
var dialogForm = new DialogInputControl();
//编辑住宅
dialogForm.SetTitleText(Language.StringByID(R.MyInternationalizationString.uChangedName));
//请输入住宅名称
dialogForm.SetTipText(Language.StringByID(R.MyInternationalizationString.uPleaseInputResidenceName));
dialogForm.Text = oldName;
//按下确认按钮
dialogForm.ComfirmClickEvent += ((textValue) =>
{
if (textValue == string.Empty)
{
//请输入住宅名称
string msg = Language.StringByID(R.MyInternationalizationString.uPleaseInputResidenceName);
this.ShowMassage(ShowMsgType.Error, msg);
return;
}
//画面关闭
dialogForm.CloseDialog();
if (oldName != textValue)
{
if (info != null)
{
//编辑云端的住宅名称
this.EditorResidenceName(textValue, info, btnHome);
}
else
{
//直接编辑住宅缓存
if (this.CheckIsCanSaveResidence(i_house.Id, textValue, true) == false)
{
return;
}
//刷新内存的住宅名
HdlResidenceLogic.Current.EditorHouseByHouseId(i_house.Id, textValue);
//更改显示的名字
btnHome.Text = textValue;
}
}
});
}
///
/// 编辑云端的住宅名称
///
///
///
///
private async void EditorResidenceName(string ResidenceName, Common.ResponseEntity.ResidenceObj info, NormalViewControl btnHome)
{
//检测能否保存住宅
if (this.CheckIsCanSaveResidence(info.Id, ResidenceName, true) == false)
{
return;
}
//开启进度条
this.ShowProgressBar();
var Pra = new EditorResidencePra();
Pra.HomeId = info.Id;
Pra.Name = ResidenceName;
Pra.IsOtherAccountCtrl = false;
Pra.LoginAccessToken = Config.Instance.Token;
//编辑住宅
bool flage = await UserCenterLogic.GetResultStatuByRequestHttps("App/EditHome", false, Pra);
//关闭进度条
this.CloseProgressBar();
if (flage == true)
{
//刷新内存的住宅名
HdlResidenceLogic.Current.EditorHouseByHouseId(info.Id, ResidenceName);
//更改显示的名字
btnHome.Text = ResidenceName;
info.Name = ResidenceName;
}
}
#endregion
#region ■ 添加住宅名称_______________________
///
/// 显示添加住宅名称的画面
///
private void ShowAddNameForm()
{
//生成一个弹窗画面
var dialogForm = new DialogInputControl();
//创建住宅
dialogForm.SetTitleText(Language.StringByID(R.MyInternationalizationString.uCreatResidence));
//请输入住宅名称
dialogForm.SetTipText(Language.StringByID(R.MyInternationalizationString.uPleaseInputResidenceName));
//按下确认按钮
dialogForm.ComfirmClickEvent += ((textValue) =>
{
if (textValue == string.Empty)
{
//请输入住宅名称
string msg = Language.StringByID(R.MyInternationalizationString.uPleaseInputResidenceName);
this.ShowMassage(ShowMsgType.Error, msg);
return;
}
//画面关闭
dialogForm.CloseDialog();
//保存住宅
this.AddNewResidence(textValue);
});
}
///
/// 向云端添加新的住宅
///
///
///
private async void AddNewResidence(string ResidenceName)
{
//检测能否保存住宅
if (this.CheckIsCanSaveResidence(string.Empty, ResidenceName, false) == false)
{
return;
}
//开启进度条
this.ShowProgressBar();
var Pra = new AddResidencePra();
Pra.Name = ResidenceName;
//添加住宅
string resultData = await UserCenterLogic.GetResponseDataByRequestHttps("App/AddHome", false, Pra);
if (resultData == null)
{
//关闭进度条
this.CloseProgressBar();
return;
}
var newInfo = Newtonsoft.Json.JsonConvert.DeserializeObject>(resultData);
HdlResidenceLogic.Current.AddHouseToMemmory(newInfo[0].Id, ResidenceName);
//重新刷新列表
this.listView.RemoveAll();
this.SetResidenceInfo(2);
}
#endregion
#region ■ 一般方法___________________________
///
/// 检测本地有没有这个住宅
///
///
private void CheckIsExsitResidence(Common.ResponseEntity.ResidenceObj info)
{
var path = System.IO.Path.Combine(Shared.IO.FileUtils.RootPath, Config.Instance.Guid, info.Id);
bool isExsit = System.IO.Directory.Exists(path);
if (isExsit == true) { return; }
//创建文件夹
Global.CreateHomeDirectory(info.Id);
//创建新的住宅
var house = new House();
house.Id = info.Id;
house.Name = info.Name;
house.IsOthreShare = info.IsOthreShare;
house.AccountType = info.AccountType;
house.MainUserDistributedMark = info.MainUserDistributedMark;
house.Longitude = info.Longitude;
house.Latitude = info.Latitude;
house.Save(false);
string fileName = house.FileName;
if (Config.Instance.HomeFilePathList.Contains(fileName) == false)
{
//添加列表
Config.Instance.HomeFilePathList.Add(fileName);
}
}
///
/// 检测能否删除住宅(有网使用)
///
///
///
private bool CheckIsCanDeleteResidence(Common.ResponseEntity.ResidenceObj info)
{
if (info.IsOthreShare == false)
{
int myCount = 0;
foreach (var data in this.dicResidenceData.Values)
{
if (data.IsOthreShare == false)
{
myCount++;
}
}
//如果此账号下只剩下唯一一个自己的住宅,则不能再删除
if (myCount == 1)
{
return false;
}
}
return true;
}
///
/// 检测能否删除住宅(无网使用)
///
///
///
private bool CheckIsCanDeleteResidence(House i_house)
{
if (i_house.IsVirtually == false)
{
//非虚拟住宅都不允许删除,只有在能联网的时候,才能删除
return false;
}
int myCount = 0;
foreach (var data in this.listLocalHouse)
{
if (data.IsVirtually == true)
{
myCount++;
}
}
//如果此账号下只剩下唯一一个虚拟的住宅,则不能再删除
if (myCount == 1)
{
return false;
}
return true;
}
///
/// 检测能否保存住宅
///
/// 住宅ID
/// 住宅名
/// isEditor
///
private bool CheckIsCanSaveResidence(string residenceId, string residenceName, bool isEditor)
{
if (this.dicResidenceData != null)
{
//住宅名字重复检测
foreach (string strId in this.dicResidenceData.Keys)
{
if (this.dicResidenceData[strId].IsOthreShare == true)
{
//分享的住宅不考虑
continue;
}
if (residenceId != strId && residenceName == this.dicResidenceData[strId].Name)
{
//住宅名字已经存在
int msgId = isEditor == true ? R.MyInternationalizationString.EditZigbeeHome_Exist : R.MyInternationalizationString.AddZigbeeHome_Exist;
string msg = Language.StringByID(msgId);
this.ShowMassage(ShowMsgType.Error, msg);
return false;
}
}
}
else
{
foreach (var myHouse in this.listLocalHouse)
{
if (myHouse.IsOthreShare == true)
{
//分享的住宅不考虑
continue;
}
if (residenceId != myHouse.Id && residenceName == myHouse.Name)
{
//住宅名字已经存在
int msgId = isEditor == true ? R.MyInternationalizationString.EditZigbeeHome_Exist : R.MyInternationalizationString.AddZigbeeHome_Exist;
string msg = Language.StringByID(msgId);
this.ShowMassage(ShowMsgType.Error, msg);
return false;
}
}
}
return true;
}
#endregion
#region ■ 界面重新激活事件___________________
///
/// 自身的上层界面关闭后,它自身处于最上层时,触发的事件
///
public override int FormActionAgainEvent()
{
if (dicResidenceData != null)
{
foreach (string keys in dicResidenceData.Keys)
{
if (Config.Instance.HomeFilePathList.Contains($"House_{keys}.json") == false)
{
this.listView.RemoveAll();
//数据已经变更 重新设置住宅信息
this.SetResidenceInfo(2);
break;
}
}
}
else
{
//检测还有这个住宅文件吗
var strPath = System.IO.Path.Combine(Shared.IO.FileUtils.RootPath, Common.Config.Instance.Guid);
foreach (var myHouse in this.listLocalHouse)
{
string fullName = System.IO.Path.Combine(strPath, myHouse.FileName);
//如果不存在了的话
if (System.IO.File.Exists(fullName) == false)
{
//数据已经变更 重新设置住宅信息
this.listView.RemoveAll();
this.SetResidenceInfo(3);
return 1;
}
}
}
return 1;
}
#endregion
#region ■ 结构体_____________________________
///
/// 访问住宅信息接口的启动参数(查询专用)
///
public class GetResidenceInfoPra : IfacePraCommon
{
///
/// RequestVersion
///
public string RequestVersion = Common.CommonPage.RequestVersion;
///
/// ReqDto
///
public TokenInfo ReqDto = new TokenInfo();
}
///
/// 访问住宅信息接口的启动参数(查询专用)
///
public class TokenInfo
{
///
/// LoginAccessToken
///
public string LoginAccessToken = Common.Config.Instance.Token;
///
/// PageSetting
///
public PageSettingInfo PageSetting = new PageSettingInfo()
{
Page = 1,
PageSize = 5000
};
}
///
/// 添加住宅的启动参数
///
public class AddResidencePra : IfacePraCommon
{
///
/// RequestVersion
///
public string RequestVersion = Common.CommonPage.RequestVersion;
///
/// LoginAccessToken
///
public string LoginAccessToken = Common.Config.Instance.Token;
///
/// Name
///
public string Name = string.Empty;
}
///
/// 新住宅的信息
///
public class NewResidenceInfo
{
///
/// ZigbeeHomeGuid
///
public string Id = string.Empty;
}
#endregion
}
}