using System;
|
using System.Collections.Generic;
|
|
namespace Shared.SimpleControl.Phone
|
{
|
public class Databackup : FrameLayout
|
{
|
//WebServiceBackup service_backup = new WebServiceBackup ();
|
|
VerticalScrolViewLayout VerticalScrolViewMiddle;
|
|
/// <summary>
|
/// 构造函数
|
/// </summary>
|
public Databackup ()
|
{
|
BackgroundColor = SkinStyle.Current.MainColor;
|
}
|
|
/// <summary>
|
/// 加载备份文件列表页面
|
/// </summary>
|
public void DatabackupShow ()
|
{
|
this.RemoveAll ();
|
#region 标题
|
var topView = new FrameLayout () {
|
Y = Application.GetRealHeight (36),
|
Height = Application.GetRealHeight (90),
|
BackgroundColor = SkinStyle.Current.MainColor
|
};
|
AddChidren (topView);
|
|
var title = new Button () {
|
X = Application.GetRealWidth (90),
|
Width = Application.GetRealWidth (640 - 180),
|
TextAlignment = TextAlignment.Center,
|
Text = UserConfig.Instance.CurrentRegion.Name + " " + Language.StringByID (R.MyInternationalizationString.Backup),
|
TextSize = 19,
|
TextColor = SkinStyle.Current.TextColor1,
|
};
|
topView.AddChidren (title);
|
title.MouseUpEventHandler += (sdf, asf) => {
|
Dialog dialog = new Dialog ();
|
|
FrameLayout bodyView = new FrameLayout ();
|
dialog.AddChidren (bodyView);
|
bodyView.MouseUpEventHandler += (lkj, oiu) => {
|
dialog.Close ();
|
};
|
|
VerticalScrolViewLayout dialogBodyView = new VerticalScrolViewLayout () {
|
Y = Application.GetRealHeight (126),
|
Gravity = Gravity.CenterHorizontal,
|
Width = Application.GetRealWidth (500),
|
Height = Application.GetRealHeight (360),
|
BackgroundColor = SkinStyle.Current.MainColor,
|
Radius = 5,
|
BorderColor = SkinStyle.Current.Transparent,
|
BorderWidth = 0
|
};
|
bodyView.AddChidren (dialogBodyView);
|
|
foreach (var homeTemp in UserConfig.Instance.HomeLists) {
|
var rowView = new RowLayout () {
|
Height = Application.GetRealHeight (110),
|
};
|
dialogBodyView.AddChidren (rowView);
|
|
Button btnRowLine = new Button () {
|
Y = Application.GetRealHeight (107),
|
Height = Application.GetRealHeight (3),
|
BackgroundColor = SkinStyle.Current.Black50Transparent
|
};
|
rowView.AddChidren (btnRowLine);
|
|
var btnPoint = new Button () {
|
Width = Application.GetRealWidth (10),
|
Height = Application.GetRealWidth (10),
|
X = Application.GetRealWidth (50),
|
Gravity = Gravity.CenterVertical,
|
UnSelectedImagePath = "Item/Point.png",
|
SelectedImagePath = "Item/Point.png",
|
Visible = homeTemp.Id != UserConfig.Instance.CurrentRegion.Id
|
};
|
rowView.AddChidren (btnPoint);
|
|
var btnName = new Button () {
|
Width = Application.GetRealWidth (550),
|
Text = homeTemp.Name,
|
TextAlignment = TextAlignment.CenterLeft,
|
X = Application.GetRealWidth (90),
|
TextColor = SkinStyle.Current.TextColor1,
|
};
|
rowView.AddChidren (btnName);
|
|
if (homeTemp.Id == UserConfig.Instance.CurrentRegion.Id) {
|
Button btnCheck = new Button () {
|
X = Application.GetRealWidth (20),
|
Y = Application.GetRealHeight (25),
|
Width = Application.GetRealWidth (72),
|
Height = Application.GetRealHeight (61),
|
UnSelectedImagePath = "Skin/Check.png",
|
};
|
rowView.AddChidren (btnCheck);
|
}
|
|
btnName.MouseUpEventHandler += (ss, ee) => {
|
if (UserConfig.Instance.CurrentRegion == homeTemp) {
|
dialog.Close ();
|
return;
|
}
|
MainPage.Loading.Start ("Please wait...");
|
System.Threading.Tasks.Task.Run (() => {
|
try {
|
var backuplist = IO.FileUtils.ReadFiles ();
|
int index = 0;
|
string oldRegionRootPath = IO.FileUtils.CreateRegionBackup (UserConfig.Instance.CurrentRegion.Id);
|
IO.FileUtils.DeleteRegionFiles (oldRegionRootPath);
|
foreach (var fileName in backuplist) {
|
System.IO.FileInfo fileInfo = new System.IO.FileInfo (IO.FileUtils.RootPath + fileName);
|
if (fileInfo.Exists) {
|
fileInfo.MoveTo (oldRegionRootPath + fileName);
|
Utlis.WriteLine ("move file : " + fileName);
|
}
|
index++;
|
Application.RunOnMainThread (() => {
|
int pro = (int)(index * 1.0 / backuplist.Count * 50);
|
MainPage.Loading.Text = pro.ToString () + "%";
|
});
|
}
|
IO.FileUtils.DeleteAllFile ();
|
string newRegionRootPath = IO.FileUtils.CreateRegionBackup (homeTemp.Id);
|
IO.FileUtils.RestoreRegionFiles (newRegionRootPath);
|
UserConfig.Instance.RefreshUserConfig ();
|
UserConfig.Instance.CurrentRegion = homeTemp;
|
UserConfig.Instance.SaveUserConfig ();
|
|
Room.InitAllRoom ();
|
//UserConfig.Instance.RefreshUserConfig ();
|
//MainPage.LoginUser.SaveUserInfo ();
|
Application.RunOnMainThread (() => {
|
new Alert ("", Language.StringByID (R.MyInternationalizationString.SwitchRegionSuccessfully),
|
Language.StringByID (R.MyInternationalizationString.Close)).Show ();
|
this.DatabackupShow ();
|
EquipmentPublicClass.CheckLinkRemote (UserConfig.Instance.internetStatus);
|
});
|
} catch (Exception ex) {
|
Application.RunOnMainThread (() => {
|
new Alert ("", Language.StringByID (R.MyInternationalizationString.CheckInternet),
|
Language.StringByID (R.MyInternationalizationString.Close)).Show ();
|
});
|
Utlis.WriteLine (ex.Message);
|
} finally {
|
Application.RunOnMainThread (() => {
|
MainPage.Loading.Hide ();
|
dialog.Close ();
|
});
|
}
|
});
|
};
|
}
|
dialog.Show ();
|
};
|
|
Button ItemButton = new Button () {
|
Width = Application.GetRealWidth (55),
|
Height = Application.GetRealHeight (55),
|
UnSelectedImagePath = "Item/+.png",
|
SelectedImagePath = "Item/+.png",
|
Y = Application.GetRealHeight (15),
|
X = Application.GetRealWidth (640 - 80),
|
};
|
topView.AddChidren (ItemButton);
|
|
ItemButton.MouseUpEventHandler += (sender, e) => {
|
Action finishAction = () => {
|
GetHomeDataBackupList ();
|
};
|
//弹窗提示上传备份Dialog
|
CommonUtlis.Current.ShowUploadToAutomaticBackupDialog (finishAction);
|
};
|
|
var back = new Button () {
|
Height = Application.GetRealHeight (90),
|
Width = Application.GetRealWidth (85),
|
UnSelectedImagePath = "Item/Back.png",
|
Gravity = Gravity.CenterVertical,
|
};
|
topView.AddChidren (back);
|
back.MouseUpEventHandler += (sender, e) => {
|
(Parent as PageLayout).PageIndex -= 1;
|
};
|
#endregion
|
|
var FrameLayoutView = new FrameLayout () {
|
Width = LayoutParams.MatchParent,
|
Height = Application.GetRealHeight (1136 - 126),
|
Y = topView.Bottom,
|
BackgroundColor = SkinStyle.Current.ViewColor,
|
};
|
AddChidren (FrameLayoutView);
|
|
VerticalScrolViewMiddle = new VerticalScrolViewLayout ();
|
VerticalScrolViewMiddle.RemoveAll ();
|
FrameLayoutView.AddChidren (VerticalScrolViewMiddle);
|
|
GetHomeDataBackupList ();
|
}
|
|
/// <summary>
|
/// 获取住宅备份数据列表
|
/// </summary>
|
void GetHomeDataBackupList ()
|
{
|
System.Threading.Tasks.Task.Run (() => {
|
try {
|
|
Application.RunOnMainThread (() => {
|
VerticalScrolViewMiddle.RemoveAll ();
|
MainPage.Loading.Start (Language.StringByID (R.MyInternationalizationString.load));
|
});
|
var revertObj = HttpServerRequest.Current.GetHomeDataBackupList ();
|
if (revertObj.Code == StateCode.SUCCESS) {
|
var data = Newtonsoft.Json.JsonConvert.DeserializeObject<List<BackupListNameInfoRes>> (revertObj.Data.ToString ());
|
if (data == null) return;
|
Application.RunOnMainThread (() => {
|
foreach (var folder in data) {
|
if (folder.backupClassify == "CUSTOM_PROJECT_BACKUP") { } else {
|
AddRowView (folder);
|
}
|
}
|
});
|
} else {
|
//提示错误
|
IMessageCommon.Current.ShowErrorInfoAlter (revertObj.Code);
|
}
|
|
} catch {
|
Application.RunOnMainThread (() => {
|
new Alert (Language.StringByID (R.MyInternationalizationString.Tip), Language.StringByID (R.MyInternationalizationString.CheckInternet), Language.StringByID (R.MyInternationalizationString.Close)).Show ();
|
});
|
} finally {
|
Application.RunOnMainThread (() => {
|
MainPage.Loading.Hide ();
|
});
|
}
|
});
|
}
|
|
/// <summary>
|
/// 加载view
|
/// </summary>
|
/// <param name="groupName"></param>
|
/// <param name="folderID"></param>
|
void AddRowView (BackupListNameInfoRes mBackupFile)
|
{
|
var rowView = new RowLayout () {
|
Height = Application.GetRealHeight (110),
|
};
|
VerticalScrolViewMiddle.AddChidren (rowView);
|
|
Button btnRowLine = new Button () {
|
Y = Application.GetRealHeight (107),
|
Height = Application.GetRealHeight (3),
|
BackgroundColor = SkinStyle.Current.Black50Transparent
|
};
|
rowView.AddChidren (btnRowLine);
|
|
var btnDelFile = new Button () {
|
TextID = R.MyInternationalizationString.Del,
|
BackgroundColor = SkinStyle.Current.DelColor
|
};
|
btnDelFile.MouseUpEventHandler += (sender, e) => {
|
Alert alert = new Alert (Language.StringByID (R.MyInternationalizationString.Tip), Language.StringByID (R.MyInternationalizationString.AreYouSureToDeleteFile), Language.StringByID (R.MyInternationalizationString.Cancel), Language.StringByID (R.MyInternationalizationString.Confrim));
|
alert.ResultEventHandler += (sender2, e2) => {
|
if (e2) {
|
DeleteFolderData (mBackupFile.id);
|
}
|
};
|
alert.Show ();
|
};
|
|
//分享住宅隐藏删除备份按钮
|
if (UserConfig.Instance.CurrentRegion.IsOthreShare == false) {
|
rowView.AddRightView (btnDelFile);
|
}
|
|
var btnPoint = new Button () {
|
Width = Application.GetRealWidth (10),
|
Height = Application.GetRealHeight (10),
|
X = Application.GetRealWidth (25),
|
Gravity = Gravity.CenterVertical,
|
UnSelectedImagePath = "Item/Point.png",
|
SelectedImagePath = "Item/Point.png",
|
};
|
rowView.AddChidren (btnPoint);
|
|
var btnName = new Button () {
|
Width = Application.GetRealWidth (342),
|
Height = LayoutParams.MatchParent,
|
Text = mBackupFile.folderName.Trim (),
|
TextAlignment = TextAlignment.CenterLeft,
|
X = Application.GetRealWidth (50),
|
TextColor = SkinStyle.Current.TextColor1,
|
};
|
rowView.AddChidren (btnName);
|
|
//保存事件
|
Action<string> renameAction = (newName) => {
|
RenameFileName (newName, mBackupFile, btnName);
|
};
|
|
btnName.MouseUpEventHandler += (sender, e) => {
|
CommonUtlis.Current.ShowEditTextDialog (mBackupFile.folderName, renameAction, Language.StringByID (R.MyInternationalizationString.rename));
|
};
|
|
var backupIcon = new Button () {
|
Width = Application.GetRealWidth (72),
|
Height = Application.GetRealHeight (57),
|
X = Application.GetRealWidth (452),
|
};
|
rowView.AddChidren (backupIcon);
|
|
var Backup_restores = new Button () {
|
Width = Application.GetMinRealAverage (56),
|
Height = Application.GetMinRealAverage (57),
|
X = backupIcon.Right + Application.GetRealWidth (20),
|
UnSelectedImagePath = "Register/Backup_ restores.png",
|
SelectedImagePath = "Register/Backup_ restores.png",
|
Gravity = Gravity.CenterVertical,
|
};
|
rowView.AddChidren (Backup_restores);
|
Backup_restores.MouseDownEventHandler += (sender, e) => {
|
Backup_restores.IsSelected = true;
|
};
|
Backup_restores.MouseUpEventHandler += (sender, e) => {
|
Backup_restores.IsSelected = false;
|
UserBakeupFileDetailedInformation (mBackupFile.id);
|
};
|
}
|
|
/// <summary>
|
/// 请求修改备注
|
/// </summary>
|
/// <param name="newName"></param>
|
/// <param name="mAlexa"></param>
|
/// <param name="btnName"></param>
|
void RenameFileName (string newName, BackupListNameInfoRes mBackupFile, Button btnName)
|
{
|
MainPage.Loading.Start (Language.StringByID (R.MyInternationalizationString.load));
|
System.Threading.Tasks.Task.Run (() => {
|
try {
|
|
var revertObj = HttpServerRequest.Current.UpdateBackupFolderName (newName, mBackupFile);
|
if (revertObj.Code == StateCode.SUCCESS) {
|
//AmendTheSuccess 修改成功
|
Application.RunOnMainThread (() => {
|
mBackupFile.folderName = newName;
|
btnName.Text = newName;
|
Utlis.ShowAlertOnMainThread (Language.StringByID (R.MyInternationalizationString.AmendTheSuccess));
|
});
|
} else {
|
//提示错误
|
IMessageCommon.Current.ShowErrorInfoAlter (revertObj.Code);
|
}
|
} catch {
|
|
} finally {
|
Application.RunOnMainThread (() => {
|
MainPage.Loading.Hide ();
|
});
|
}
|
});
|
|
}
|
|
/// <summary>
|
/// 删除某个备份
|
/// </summary>
|
/// <param name="folderID"></param>
|
void DeleteFolderData (string folderId)
|
{
|
MainPage.Loading.Start (Language.StringByID (R.MyInternationalizationString.load));
|
|
System.Threading.Tasks.Task.Run (() => {
|
try {
|
|
var revertObj = HttpServerRequest.Current.DeleteBackupFolder (folderId);
|
if (revertObj.Code == StateCode.SUCCESS) {
|
GetHomeDataBackupList ();
|
} else {
|
IMessageCommon.Current.ShowErrorInfoAlter (revertObj.Code);
|
}
|
} catch { } finally {
|
Application.RunOnMainThread (() => {
|
MainPage.Loading.Hide ();
|
});
|
}
|
});
|
|
}
|
|
/// <summary>
|
/// 用户恢复文件
|
/// </summary>
|
public void UserBakeupFileDetailedInformation (string folderId)
|
{
|
//是否确定恢复该文件数据信息
|
Alert alert = new Alert (Language.StringByID (R.MyInternationalizationString.Tip), Language.StringByID (R.MyInternationalizationString.SureToRestoreFileInformation), Language.StringByID (R.MyInternationalizationString.Cancel), Language.StringByID (R.MyInternationalizationString.Confrim));
|
alert.ResultEventHandler += (sender2, e2) => {
|
if (e2) {
|
MainPage.Loading.Start ("Download...");
|
System.Threading.Tasks.Task.Run (() => {
|
try {
|
ReadFilesAndDelete ();
|
|
var revertObj = HttpServerRequest.Current.GetBackupFolderAllFileList (folderId);
|
if (revertObj.Code == StateCode.SUCCESS) {
|
|
var fileListData = Newtonsoft.Json.JsonConvert.DeserializeObject<List<BackupFileInfoRes>> (revertObj.Data.ToString ());
|
|
MultiThreadDownload (fileListData, folderId);
|
|
} else {
|
//提示错误
|
IMessageCommon.Current.ShowErrorInfoAlter (revertObj.Code);
|
}
|
} catch (Exception ex) {
|
Shared.Application.RunOnMainThread (() => {
|
new Alert (Language.StringByID (R.MyInternationalizationString.Tip), Language.StringByID (R.MyInternationalizationString.CheckInternet),
|
Language.StringByID (R.MyInternationalizationString.Close)).Show ();
|
});
|
Shared.Utlis.WriteLine (ex.ToString ());
|
} finally {
|
Shared.Application.RunOnMainThread (() => {
|
|
|
MainPage.Loading.Hide ();
|
|
|
|
MainPage.Loading.Start (Language.StringByID (R.MyInternationalizationString.load));
|
System.Threading.Tasks.Task.Run (() => {
|
try {
|
|
var revertObj = HttpServerRequest.Current.GetSpeakerList ();
|
if (revertObj.Code == StateCode.SUCCESS) {
|
var speakerListRes = Newtonsoft.Json.JsonConvert.DeserializeObject<SpeakerListRes> (revertObj.Data.ToString ());
|
if (speakerListRes != null && speakerListRes.list != null && speakerListRes.list.Count > 0) {
|
|
}
|
} else {
|
//提示错误
|
IMessageCommon.Current.ShowErrorInfoAlter (revertObj.Code);
|
}
|
} catch {
|
|
} finally {
|
Application.RunOnMainThread (() => {
|
MainPage.Loading.Hide ();
|
});
|
}
|
});
|
|
|
});
|
}
|
});
|
}
|
};
|
alert.Show ();
|
}
|
|
/// <summary>
|
/// 删除本地文件
|
/// </summary>
|
void ReadFilesAndDelete ()
|
{
|
var fileNames = IO.FileUtils.ReadFiles ();
|
foreach (var fileName in fileNames) {
|
if (fileName == UserInfo.GlobalRegisterFile || fileName == UserConfig.configFile) {
|
continue;
|
}
|
IO.FileUtils.DeleteFile (fileName);
|
}
|
|
}
|
|
/// <summary>
|
///
|
/// </summary>
|
private readonly object SendLocker = new object ();
|
/// <summary>
|
///
|
/// </summary>
|
private readonly object DownloadLocker = new object ();
|
|
/// <summary>
|
/// 多线程下载
|
/// </summary>
|
void MultiThreadDownload (List<BackupFileInfoRes> dataList, string folderId, int maxThreads = 5)
|
{
|
|
int index = 0;
|
int indexCount = 0;
|
var mFileList = dataList.FindAll ((obj) => obj.fileName != "null" && obj.fileName != UserConfig.configFile && obj.fileName != UserInfo.GlobalRegisterFile && obj.fileName != "AccountListDB" && obj.fileName != CommonConfig.ConfigFile);
|
if (maxThreads > mFileList.Count) {
|
maxThreads = mFileList.Count;
|
}
|
|
if (mFileList.Count <= 0) return;
|
|
int resultCount = mFileList.Count / maxThreads;
|
|
//int residue = mFileList.Count % maxThreads;
|
|
/*开启若干线程,分别下载对应的资源*/
|
for (int i = 1; i <= maxThreads; i++) {
|
int startIndex = ((i - 1) * resultCount + 0);
|
int endIndex = resultCount * i - 1;
|
if (i == maxThreads) {
|
/*
|
* 最后一个线程
|
* */
|
endIndex = mFileList.Count - 1;
|
}
|
var id = i;
|
var startIndex1 = startIndex;
|
var endIndex1 = endIndex;
|
//Utlis.WriteLine ($"下载线程:{id} startIndex1:{startIndex1} endIndex1:{endIndex1}");
|
new System.Threading.Thread (() => {
|
|
for (var j = startIndex1; j <= endIndex1; j++) {
|
try {
|
var result = DownloadSomeDataBackup (folderId, mFileList [j]);
|
if (result) {
|
lock (DownloadLocker) {
|
index++;
|
}
|
|
//index++;
|
|
Application.RunOnMainThread (() => {
|
int pro = (int)(index * 1.0 / mFileList.Count * 100);
|
MainPage.Loading.Text = pro.ToString () + "%";
|
});
|
|
}
|
} catch { } finally {
|
lock (SendLocker) {
|
indexCount++;
|
}
|
}
|
//Utlis.WriteLine ($"下载线程:{id} 完成index:{j} indexCount: {indexCount}");
|
}
|
|
}) { IsBackground = true }.Start ();
|
|
System.Threading.Thread.Sleep (100);
|
|
}
|
|
while (indexCount < mFileList.Count) {
|
System.Threading.Thread.Sleep (200);
|
}
|
Utlis.WriteLine ($"下载完成");
|
|
if (index != mFileList.Count) {
|
//删除已经下载的文件个数错误
|
ReadFilesAndDelete ();
|
|
Application.RunOnMainThread (() => {
|
new Alert (Language.StringByID (R.MyInternationalizationString.Tip), Language.StringByID (R.MyInternationalizationString.DownloadFailed),
|
Language.StringByID (R.MyInternationalizationString.Close)).Show ();
|
});
|
|
|
return;
|
}
|
|
|
MainPage.LoginUser.SaveUserInfo ();
|
Room.InitAllRoom ();
|
Application.RunOnMainThread (() => {
|
//if (CommonPage.IsRemote) {
|
// SmartHome.MqttCommon.DisConnectRemote("UserBakeupFileDetailedInformation");
|
//}
|
this.RemoveFromParent ();
|
UserMiddle.Init (true, true);
|
EquipmentPublicClass.CheckLinkRemote (UserConfig.Instance.internetStatus);
|
new Alert (Language.StringByID (R.MyInternationalizationString.Tip), Language.StringByID (R.MyInternationalizationString.RestoreFileIsSuccessfull),
|
Language.StringByID (R.MyInternationalizationString.Close)).Show ();
|
});
|
|
|
|
}
|
|
/// <summary>
|
/// 下载单个备份文件
|
/// </summary>
|
/// <param name="mmDownLoad"></param>
|
/// <param name="mUrlHead"></param>
|
/// <param name="file"></param>
|
/// <returns></returns>
|
bool DownloadSomeDataBackup (string folderId, BackupFileInfoRes file)
|
{
|
var requestJson = HttpUtil.GetSignRequestJson (new BackupFileDownObj () {
|
folderId = folderId,
|
fileId = file.id,
|
homeId = UserConfig.Instance.CurrentRegion.Id
|
});
|
var revertObj = HttpUtil.RequestHttpsDownload (NewAPI.API_POST_File_Down, requestJson, null, UserConfig.Instance.CurrentRegion.regionUrl);
|
|
if (revertObj != null && revertObj.Length > 0) {
|
Utlis.WriteLine ("DownloadSomeDataBackup: " + file.fileName);
|
IO.FileUtils.WriteFileByBytes (file.fileName, revertObj);
|
return true;
|
} else {
|
return false;
|
}
|
}
|
|
#region 备上传和下载相关接口封装
|
|
#endregion
|
|
}
|
}
|