using System; using System.Collections.Generic; using System.Linq; using System.Text.RegularExpressions; using Shared.SimpleControl; namespace Shared { public class CommonUtlis { #region ■ Current___________________________ /// /// 通用方法 /// private static CommonUtlis m_Current = null; /// /// 通用方法 /// public static CommonUtlis Current { get { if (m_Current == null) { m_Current = new CommonUtlis (); } return m_Current; } } #endregion #region ■ 各种正确检测_______________________ /// /// 用于中国大陆验证手机号正则表达式 /// public static string PhoneRegexStr = "^[1][0-9]{10}$"; /// /// 用于验证非中国大陆手机号正则表达式 /// public static string PhoneForForeignRegexStr = "^[0-9]*$"; /// /// 用于验证邮箱正则表达式 /// public static string EmailRegexStr = "^\\s*([A-Za-z0-9_-]+(\\.\\w+)*@(\\w+\\.)+\\w{2,5})\\s*$"; /// /// 用于密码强度正则表达式 /// 密码必须为8-20个字符,包含字母、数字和符号 /// //public static string PasswordRegexStr = "^(?![0-9]+$)(?![a-zA-Z]+$)(?![0-9a-zA-Z]+$)(?![0-9\\W]+$)(?![a-zA-Z\\W]+$)[0-9A-Za-z\\W]{8,20}$"; public static string PasswordRegexStr = @"^(?=.*?[A-Z])(?=.*?[a-z])(?=.*?[0-9])(?=.*?[^\w\s]).{8,20}$";//必须包含一个大写,一个小写字母,一个数字,一个特殊字符,且长度为8到20位 /// /// 判断是否包含大写字母 /// /// true, if contain upper was checked, false otherwise. /// Value. public bool CheckContainUpper (string value) { Regex reg = new Regex ("[A-Z]+"); return reg.IsMatch (value); } /// /// 判断是否包含小写字母 /// /// true, if contain lower was checked, false otherwise. /// Value. public bool CheckContainLower (string value) { Regex reg = new Regex ("[a-z]+"); return reg.IsMatch (value); } /// /// 判断是否包含数字 /// /// true, if contain lower was checked, false otherwise. /// Value. public bool CheckContainNum (string value) { Regex reg = new Regex ("[0-9]+"); return reg.IsMatch (value); } /// /// 判断是否包含符号 /// /// true, if contain lower was checked, false otherwise. /// Value. public bool CheckContainSymbol (string value) { Regex reg = new Regex ("([^a-z0-9A-Z])+"); return reg.IsMatch (value); } /// /// 检测邮箱是否合法 /// /// /// public bool CheckEmail (string email) { Regex reg = new Regex (EmailRegexStr); return reg.IsMatch (email); } /// /// 检测手机号是否合法 /// /// 手机号 /// 地区代码 /// public bool CheckPhoneNumber (string phoneNumber, string areaCode) { //校验外国手机号 if (areaCode != "86") { Regex reg = new Regex (PhoneForForeignRegexStr); return reg.IsMatch (phoneNumber); } //校验国内手机号 if (phoneNumber.Length > 11) { return false; } else if (phoneNumber.Length == 11) { Regex reg = new Regex (PhoneRegexStr); return reg.IsMatch (phoneNumber); } else { //正则表达式判断是否数字 Regex reg = new Regex ("^[0-9]*$"); return reg.IsMatch (phoneNumber); } } /// /// 检测密码是否合法 /// /// /// public bool CheckPassword (string password) { Regex reg = new Regex (PasswordRegexStr); return reg.IsMatch (password); } #endregion /// /// 检测iOS是否越狱和Android是否root /// public void CheckIfJailBreak () { #if __IOS__ var mes = "Your phone has been Jailbroken and you cannot use the APP."; #else var mes = "Your phone has been ROOT and you cannot use the APP."; #endif //if (Shared.HDLUtils.ISJailBreak ()) { // Alert alert = new Alert ("", mes, Language.StringByID (SimpleControl.R.MyInternationalizationString.Confrim)); // alert.ResultEventHandler += (sender2, e2) => { // Shared.HDLUtils.ExitApplication (); // }; // alert.Show (); //} } /// /// 弹窗提示 /// /// 弹窗提示信息 /// 确认按钮事件 public void ShowActionAlert (string mes, Action okAction) { Alert alert = new Alert ("", mes, Language.StringByID (SimpleControl.R.MyInternationalizationString.Cancel), Language.StringByID (SimpleControl.R.MyInternationalizationString.Confrim)); alert.ResultEventHandler += (sender2, e2) => { if (e2) { okAction?.Invoke (); } }; alert.Show (); } #region ■ 通用Dialog_______________________ /// /// 通用编辑Dialog /// /// /// public void ShowEditTextDialog (string nameStr, Action saveAction, string titleStr = "") { Dialog dialog = new Dialog (); FrameLayout dialogBodyView = new FrameLayout () { Gravity = Gravity.Center, Width = Application.GetRealWidth (500), Height = Application.GetRealHeight (330), Radius = 5, BorderColor = SkinStyle.Current.Transparent, BorderWidth = 0, BackgroundColor = SkinStyle.Current.DialogColor, }; dialog.AddChidren (dialogBodyView); Button btnTitle = new Button () { Height = Application.GetRealHeight (80), TextAlignment = TextAlignment.Center, Text = titleStr, TextColor = SkinStyle.Current.DialogTextColor, BackgroundColor = SkinStyle.Current.DialogTitle, }; dialogBodyView.AddChidren (btnTitle); EditText etZoneName = new EditText () { X = Application.GetRealWidth (50), Y = Application.GetRealHeight (120), Width = Application.GetRealWidth (400), Height = Application.GetRealHeight (80), TextColor = SkinStyle.Current.TextColor, TextAlignment = TextAlignment.Center, Radius = 5, BorderColor = SkinStyle.Current.BorderColor, BorderWidth = 2, Text = nameStr, }; dialogBodyView.AddChidren (etZoneName); FrameLayout BottomView = new FrameLayout () { Y = dialogBodyView.Height - Application.GetRealHeight (88), Height = Application.GetRealHeight (90), BackgroundColor = SkinStyle.Current.Black50Transparent, }; dialogBodyView.AddChidren (BottomView); Button btnClose = new Button () { Width = Application.GetRealWidth (250), TextID = SimpleControl.R.MyInternationalizationString.Close, TextColor = SkinStyle.Current.DialogTextColor, BackgroundColor = SkinStyle.Current.DialogTitle, }; BottomView.AddChidren (btnClose); btnClose.MouseUpEventHandler += (sdf, fds) => { dialog.Close (); }; Button btnOption = new Button () { X = btnClose.Right + Application.GetRealWidth (2), Width = Application.GetRealWidth (250), TextID = SimpleControl.R.MyInternationalizationString.SAVE, TextColor = SkinStyle.Current.DialogTextColor, BackgroundColor = SkinStyle.Current.DialogTitle, }; BottomView.AddChidren (btnOption); btnOption.MouseUpEventHandler += (sdf, fds) => { //修改名称 var newStr = etZoneName.Text.Trim (); //输入内容不能为空 if (string.IsNullOrEmpty (newStr)) { Utlis.ShowTip (Language.StringByID(SimpleControl.R.MyInternationalizationString.PleaseEnterContent)); return; } if (nameStr != newStr) { saveAction?.Invoke (newStr); } dialog.Close (); }; dialog.Show (); } #endregion #region ■ 共用上传备份操作_______________________ /// /// 将当前本地数据上传到自动备份 /// /// 上传结束事件 public void ShowUploadToAutomaticBackupDialog (Action finishAction) { Dialog dialog = new Dialog (); FrameLayout dialogBodyView = new FrameLayout () { Gravity = Gravity.Center, Width = Application.GetRealWidth (500), Height = Application.GetRealHeight (500), BackgroundColor = SkinStyle.Current.DialogColor, Radius = 5, BorderColor = SkinStyle.Current.Transparent, BorderWidth = 0, }; dialog.AddChidren (dialogBodyView); Button btnTitle = new Button () { Height = Application.GetRealHeight (80), BackgroundColor = SkinStyle.Current.DialogTitle, TextAlignment = TextAlignment.Center, TextID = SimpleControl.R.MyInternationalizationString.Backup, TextColor = SkinStyle.Current.DialogTextColor }; dialogBodyView.AddChidren (btnTitle); //Button btnGoDownTip = new Button () { // Gravity = Gravity.CenterHorizontal, // Y = Application.GetRealHeight (90 - 26), // Width = Application.GetRealWidth (53), // Height = Application.GetRealHeight (26), // UnSelectedImagePath = "Room/godown.png", //}; //dialogBodyView.AddChidren (btnGoDownTip); Button btnackupRemark = new Button () { Gravity = Gravity.CenterHorizontal, Y = Application.GetRealHeight (100), Width = Application.GetRealWidth (400), Height = Application.GetRealHeight (80), TextID = SimpleControl.R.MyInternationalizationString.Remark, TextAlignment = TextAlignment.CenterLeft, TextColor = SkinStyle.Current.TextColor, }; dialogBodyView.AddChidren (btnackupRemark); EditText etBackupRemark = new EditText () { Gravity = Gravity.CenterHorizontal, Y = btnackupRemark.Bottom, Width = Application.GetRealWidth (400), Height = Application.GetRealHeight (80), TextAlignment = TextAlignment.Center, Radius = 5, BorderColor = SkinStyle.Current.BorderColor, BorderWidth = 1, TextColor = SkinStyle.Current.TextColor, }; dialogBodyView.AddChidren (etBackupRemark); etBackupRemark.EditorEnterAction += (obj) => { Application.HideSoftInput (); }; FrameLayout bottomView = new FrameLayout () { Y = Application.GetRealHeight (420), Height = Application.GetRealHeight (85), BackgroundColor = SkinStyle.Current.DialogTitle }; dialogBodyView.AddChidren (bottomView); Button btnClose = new Button () { Width = Application.GetRealWidth (249), TextID = SimpleControl.R.MyInternationalizationString.Close, TextAlignment = TextAlignment.Center }; bottomView.AddChidren (btnClose); btnClose.MouseUpEventHandler += (send2er, e2) => { dialog.Close (); }; Button btnBottomLine = new Button () { X = btnClose.Right, Width = 1, BackgroundColor = SkinStyle.Current.Black50Transparent, }; bottomView.AddChidren (btnBottomLine); Button btnSave = new Button () { X = btnBottomLine.Right, Width = Application.GetRealWidth (249), TextID = SimpleControl.R.MyInternationalizationString.SAVE, TextAlignment = TextAlignment.Center }; bottomView.AddChidren (btnSave); btnSave.MouseUpEventHandler += (sender2, e2) => { if (etBackupRemark.Text.Trim () == "") { new Alert (Language.StringByID (SimpleControl.R.MyInternationalizationString.Tip), Language.StringByID (SimpleControl.R.MyInternationalizationString.InputNewBakeUpFilesName), Language.StringByID (SimpleControl.R.MyInternationalizationString.Close)).Show (); return; } if (MainPage.LoginUser == null) { new Alert (Language.StringByID (SimpleControl.R.MyInternationalizationString.Tip), Language.StringByID (SimpleControl.R.MyInternationalizationString.PleaseLoginSystem), Language.StringByID (SimpleControl.R.MyInternationalizationString.Close)).Show (); return; } userBakeupFile (etBackupRemark.Text.Trim (), finishAction); dialog.Close (); }; dialog.Show (); } ///// ///// 交互备份 ///// //int InteractiveBackup = 0; ///// ///// 自定义工程备份 ///// //int CustomProjectBackup = 1; ///// ///// 用户自动备份 ///// //int UserAutoBackup = 2; ///// ///// 用户自定义备份 ///// //int UserCustomizedBackup = 3; /// /// 用户备份文件 /// void userBakeupFile (string folderName, Action finishAction) { MainPage.Loading.Start ("Upload..."); System.Threading.Tasks.Task.Run (() => { try { var revertObj = HttpServerRequest.Current.CreateBackupFolder(folderName); if (revertObj.Code == StateCode.SUCCESS) { var mBackupFolderCreateRes = Newtonsoft.Json.JsonConvert.DeserializeObject (revertObj.Data.ToString ()); //UpLoadBackupFileNEW (mBackupFolderCreateRes.id); UpLoadBackupFileOne (mBackupFolderCreateRes.id); } else { IMessageCommon.Current.ShowErrorInfoAlter (revertObj.Code); } } catch (Exception ex) { Shared.Application.RunOnMainThread (() => { new Alert (Language.StringByID (SimpleControl.R.MyInternationalizationString.Tip), Language.StringByID (SimpleControl.R.MyInternationalizationString.CheckInternet), Language.StringByID (SimpleControl.R.MyInternationalizationString.Close)).Show (); Shared.Utlis.WriteLine (ex.Message); }); } finally { Shared.Application.RunOnMainThread (() => { MainPage.Loading.Hide (); //结束事件 finishAction?.Invoke (); }); } }); } //2020-01-11 /// /// 删除某个备份 /// /// void DeleteFolderDataAfterUploadFailed (string folderID) { try { var revertObj = HttpServerRequest.Current.DeleteBackupFolder (folderID); if (revertObj.Code == StateCode.SUCCESS) { //GetHomeDataBackupList (); } else { //IMessageCommon.Current.ShowErrorInfoAlter (API.API_DELETE_Folder_Delete, revertObj.StateCode); } } catch { } finally { Application.RunOnMainThread (() => { MainPage.Loading.Hide (); }); } } /// /// 上传备份文件 /// 多次上传多个文件 /// /// public void UpLoadBackupFileOne (string folderId) { var backuplist = IO.FileUtils.ReadFiles (); var mFileList = backuplist.FindAll ((obj) => obj != "null" && obj != UserConfig.configFile && obj != UserInfo.GlobalRegisterFile && obj != "AccountListDB" && obj != CommonConfig.ConfigFile && (!obj.Contains (".json"))); if (mFileList.Count <= 0) return; int resultCount = mFileList.Count; int index = 0; foreach (var fileName in mFileList) { byte [] fileBytes = IO.FileUtils.ReadFile (fileName); var result = UploadDataBackupByOne (folderId, fileName, fileBytes); if (result) { index++; Application.RunOnMainThread (() => { int pro = (int)(index * 1.0 / resultCount * 100); MainPage.Loading.Text = pro.ToString () + "%"; }); } else { Console.WriteLine ("上传失败:" + fileName); } } Utlis.WriteLine ($"上传完成"); if (index != resultCount) { //2020-01-11 备份失败 DeleteFolderDataAfterUploadFailed (folderId); Shared.Application.RunOnMainThread (() => { new Alert ("", Language.StringByID (SimpleControl.R.MyInternationalizationString.FailedToBackupFile), Language.StringByID (SimpleControl.R.MyInternationalizationString.Close)).Show (); MainPage.Loading.Hide (); }); return; } Application.RunOnMainThread (() => { //MainPage.Loading.Text = "100%"; new Alert ("", Language.StringByID (SimpleControl.R.MyInternationalizationString.BackupFileIsSuccessful), Language.StringByID (SimpleControl.R.MyInternationalizationString.Close)).Show (); }); } /// /// /// /// /// /// /// bool UploadDataBackupByOne (string folderId, string fileName, byte [] fileBytes) { try { var queryDic = new Dictionary (); queryDic.Add ("folderId", folderId); queryDic.Add ("fileName", fileName); queryDic.Add ("homeId", UserConfig.Instance.CurrentRegion.Id); var revertObj = HttpUtil.RequestHttpsUpload (RestSharp.Method.POST, NewAPI.API_POST_File_Create, fileBytes, queryDic, null, UserConfig.Instance.CurrentRegion.regionUrl); if (revertObj.Code == StateCode.SUCCESS) { return true; } else { //提示错误 return false; } } catch { return false; } } #endregion //#region ■ 文件操作_______________________ ///// ///// 删除本地文件 ///// //public void ReadFilesAndDelete () //{ // var fileNames = IO.FileUtils.ReadFiles (); // foreach (var fileName in fileNames) { // if (fileName == UserInfo.GlobalRegisterFile || fileName == UserConfig.configFile || fileName == MqttInfoConfig.ConfigFile || fileName == APIInfoConfig.ConfigFile) { // continue; // } // IO.FileUtils.DeleteFile (fileName); // } //} //#endregion #region 设备列表过滤 /// /// 找出需要显示的设备,加载当前APP支持的所有设备类型 /// /// public List GetAllLocalEquipments () { //找出需要显示的设备 var filesList = IO.FileUtils.ReadFiles ().FindAll ((obj) => { string [] str = obj.Split ('_'); return obj.StartsWith ("Equipment_") && str.Length == 5; }); var localEquipments = filesList.FindAll ((obj) => { string typeString = obj.Split ('_') [1]; return ( #region light typeString.ToString () == DeviceType.LightCCT.ToString () || typeString.ToString () == DeviceType.LightRGB.ToString () || typeString.ToString () == DeviceType.LightDALI.ToString () || typeString.ToString () == DeviceType.LightRGBW.ToString () || typeString.ToString () == DeviceType.LightLogic.ToString () || typeString.ToString () == DeviceType.LightSwitch.ToString () || typeString.ToString () == DeviceType.LightDimming.ToString () || typeString.ToString () == DeviceType.LightMixSwitch.ToString () || typeString.ToString () == DeviceType.LightRGBandCCT.ToString () || typeString.ToString () == DeviceType.LightMixDimming.ToString () || typeString.ToString () == DeviceType.LightEnergySwitch.ToString () || typeString.ToString () == DeviceType.LightEnergySocket.ToString () || typeString.ToString () == DeviceType.LightSwitchSocket.ToString () || typeString.ToString () == DeviceType.DMX48.ToString () #endregion #region light || typeString.ToString () == DeviceType.SensorCH4.ToString () || typeString.ToString () == DeviceType.SensorCO2.ToString () || typeString.ToString () == DeviceType.SensorLPG.ToString () || typeString.ToString () == DeviceType.SensorCOH2.ToString () || typeString.ToString () == DeviceType.SensorPM25.ToString () || typeString.ToString () == DeviceType.SensorTVOC.ToString () || typeString.ToString () == DeviceType.SensorPower.ToString () || typeString.ToString () == DeviceType.SensorSmoke.ToString () || typeString.ToString () == DeviceType.SensorWater.ToString () || typeString.ToString () == DeviceType.SensorWeight.ToString () || typeString.ToString () == DeviceType.SensorCurrent.ToString () || typeString.ToString () == DeviceType.SensorVoltage.ToString () || typeString.ToString () == DeviceType.SensorRainfall.ToString () || typeString.ToString () == DeviceType.SensorVelocity.ToString () || typeString.ToString () == DeviceType.SensorMenciAndwindowMagnetic.ToString () || typeString.ToString () == DeviceType.SensorMobileDetection.ToString () || typeString.ToString () == DeviceType.SensorLiquidPressure.ToString () || typeString.ToString () == DeviceType.SensorVibration.ToString () || typeString.ToString () == DeviceType.SensorLiquidFlow.ToString () || typeString.ToString () == DeviceType.SensorLiquidDepth.ToString () || typeString.ToString () == DeviceType.SensorTemperature.ToString () || typeString.ToString () == DeviceType.SensorHeightLength.ToString () || typeString.ToString () == DeviceType.SensorIllumination.ToString () || typeString.ToString () == DeviceType.SensorWindPressure.ToString () || typeString.ToString () == DeviceType.SensorHumidity.ToString () #endregion #region curtain || typeString.ToString () == DeviceType.CurtainModel.ToString () || typeString.ToString () == DeviceType.CurtainRoller.ToString () || typeString.ToString () == DeviceType.CurtainTrietex.ToString () #endregion #region ac || typeString.ToString () == DeviceType.ACPanel.ToString () || typeString.ToString () == DeviceType.ACDevice.ToString () || typeString.ToString () == DeviceType.ACInfrared.ToString () || typeString.ToString () == DeviceType.ACCoolmaster.ToString () || typeString.ToString () == DeviceType.CustomAC.ToString () || typeString.ToString () == DeviceType.HVAC.ToString () #endregion #region foolheat || typeString.ToString () == DeviceType.FoolHeat.ToString () || typeString.ToString () == DeviceType.FoolHeatPanel.ToString () #endregion #region || typeString.ToString () == DeviceType.InfraredMode.ToString () || typeString.ToString () == DeviceType.DoorLock.ToString () || typeString.ToString () == DeviceType.FanModule.ToString () || typeString.ToString () == DeviceType.FreshAir.ToString () || typeString.ToString () == DeviceType.InfraredTV.ToString () || typeString.ToString () == DeviceType.UniversalDevice.ToString () || typeString.ToString () == DeviceType.MusicModel.ToString () || typeString.ToString () == DeviceType.SecurityModule.ToString () || typeString.ToString () == DeviceType.LogicModule.ToString () || typeString.ToString () == DeviceType.SecurityPanel.ToString () #endregion ); }); return localEquipments; } #endregion /// /// 本地Common匹配云端的FunctionList 返回Function /// 匹配子网号、设备号、回路号、大类小类 /// /// 本地设备 /// public Function CommonToFunction (Common common, List FunctionList) { if (FunctionList == null) return null; foreach (var function in FunctionList) { if (common.SubnetID == function.bus.SubnetID && common.DeviceID == function.bus.DeviceID && common.LoopID == function.bus.LoopId && common.DeviceTypeString == function.DeviceTypeString ) { return function; } } return null; } } }