From 1de638833e4b07b5e6c272cf5c8474b5c92ce42f Mon Sep 17 00:00:00 2001 From: wxr <464027401@qq.com> Date: 星期二, 05 九月 2023 15:21:48 +0800 Subject: [PATCH] 删除音乐权限申请 --- OnPro/HDL_ON/UI/UI2/3-Intelligence/Automation/InpOrOutLogicMethod.cs | 947 ---------------------------------------------------------- 1 files changed, 5 insertions(+), 942 deletions(-) diff --git a/OnPro/HDL_ON/UI/UI2/3-Intelligence/Automation/InpOrOutLogicMethod.cs b/OnPro/HDL_ON/UI/UI2/3-Intelligence/Automation/InpOrOutLogicMethod.cs index 1d787cb..81385d2 100644 --- a/OnPro/HDL_ON/UI/UI2/3-Intelligence/Automation/InpOrOutLogicMethod.cs +++ b/OnPro/HDL_ON/UI/UI2/3-Intelligence/Automation/InpOrOutLogicMethod.cs @@ -149,7 +149,6 @@ switch (device.spk) { //寮�鍏崇伅鍏� - case SPK.AirSwitch: case SPK.LightDimming: case SPK.LightRGB: case SPK.LightRGBW: @@ -169,9 +168,6 @@ //鏂伴 case SPK.AirFreshStandard: case SPK.HvacAirFresh: - //鎻掑骇 - case SPK.PanelSocket: - case SPK.ElectricSocket: {//寮�鍏崇伅 string value = this.GetKeyValue("on_off", dicList); inputView.btnState.Text = Language.StringByID(StringId.offLogic); @@ -179,329 +175,6 @@ { inputView.btnState.Text = Language.StringByID(StringId.onLogic); } - } - break; - //浼犳劅鍣� - case SPK.SensorHelp: - { - string value = this.GetKeyValue("alarm_status", dicList); - inputView.btnState.Text = Language.StringByID(StringId.zhengchang); - if (value == "alarm") - { - inputView.btnState.Text = Language.StringByID(StringId.qiujiu); - } - } - break; - case SPK.SensorSmoke: - case SPK.SensorGas: - { - string value = this.GetKeyValue("alarm_status", dicList); - inputView.btnState.Text = Language.StringByID(StringId.wuxieluo); - if (value == "alarm") - { - inputView.btnState.Text = Language.StringByID(StringId.xieluo); - - } - } - break; - case SPK.SensorWater: - { - string value = this.GetKeyValue("alarm_status", dicList); - inputView.btnState.Text = Language.StringByID(StringId.wuluoshui); - if (value == "alarm") - { - inputView.btnState.Text = Language.StringByID(StringId.luoshui); - } - } - break; - case SPK.SensorDryContact: - case SPK.SensorDryContact2: - { - - string value = this.GetKeyValue("on_off", dicList); - inputView.btnState.Text = Language.StringByID(StringId.offLogic); - if (value == "on") - { - inputView.btnState.Text = Language.StringByID(StringId.onLogic); - } - } - break; - case SPK.SensorShanLan: - case SPK.SensorDuiShe: - case SPK.SensorPir: - { - string value = this.GetKeyValue("people_status", dicList); - inputView.btnState.Text = Language.StringByID(StringId.wuren); - if (value == "true") - { - inputView.btnState.Text = Language.StringByID(StringId.youren); - - } - } - break; - case SPK.SensorDoorWindow: - { - string value = this.GetKeyValue("contact_status", dicList); - inputView.btnState.Text = Language.StringByID(StringId.bihe); - if (value == "open") - { - inputView.btnState.Text = Language.StringByID(StringId.kaiqi); - } - - } - break; - case SPK.SensorUtrasonic: - { - string key = this.GetKey(dicList); - string value = this.GetValue(dicList); - string str = ""; - switch (key) - { - case "status": - case "people_status": - { - str = Language.StringByID(StringId.wuren); - if (value == "true") - { - str = Language.StringByID(StringId.youren); - } - } - break; - case "dismantle": - { - str = Language.StringByID(StringId.buzaixian); - if (value == "true") - { - str = Language.StringByID(StringId.zaixian); - } - } - break; - - } - inputView.btnState.Text = str; - } - break; - case SPK.SenesorMegahealth: - case SPK.SensorMmvPose: - { - string key = this.GetKey(dicList); - string value = this.GetValue(dicList); - if (key == "people_status") - { - inputView.btnState.Text = Language.StringByID(StringId.wuren); - if (value == "true") - { - inputView.btnState.Text = Language.StringByID(StringId.youren); - } - } - else if (key == "target_status") - { - if (value == "4") - { - inputView.btnState.Text = Language.StringByID(StringId.shi); - } - } - } - break; - case SPK.SenesorMegahealth2: - { - string value = this.GetValue(dicList); - inputView.btnState.Text = Language.StringByID(StringId.wuren); - if (value == "fall") - { - inputView.btnState.Text = Language.StringByID(StringId.diedao); - } - } - break; - case SPK.SensorEnvironment: - case SPK.SensorEnvironmentHailin: - case SPK.SensorEnvironment2: - case SPK.SensorEnvironment3: - { - string strtext = ""; - foreach (var dic in dicList) - { - string key = dic["key"]; - string value = dic["value"]; - string comparator = dic["comparator"]; - switch (key) - { - - case "temperature": - { - if (comparator == ">") - { - strtext = ">" + value + "鈩�"; - } - else if (comparator == "<") - { - strtext = "<" + value + "鈩�"; - } - - } - break; - case "humidity": - { - if (comparator == ">") - { - strtext = ">" + value + "%"; - } - else if (comparator == "<") - { - strtext = "<" + value + "%"; - } - - } - break; - case "co2": - { - strtext = Language.StringByID(StringId.co2) + new PublicInterface { }.GetString("co2", value); - } - break; - case "pm25": - { - strtext = Language.StringByID(StringId.pm25) + new PublicInterface { }.GetString("pm25", value); - } - break; - case "tvoc": - { - strtext = Language.StringByID(StringId.tvoc) + new PublicInterface { }.GetString("tvoc", value); - } - break; - } - inputView.btnState.Text = strtext; - } - - - } - break; - case SPK.SensorTemperature: - { - - string str = this.GetText(dicList, "temperature"); - inputView.btnState.Text = str; - } - break; - case SPK.SensorHumidity: - { - string str = this.GetText(dicList, "humidity"); - inputView.btnState.Text = str; - - } - break; - case SPK.SensorPm10: - case SPK.SensorCO2: - case SPK.SensorPm25: - case SPK.SensorTVOC: - case SPK.SensorHcho: - { - string value = this.GetValue(dicList); - string str = new PublicInterface().GetSensorLevelText(device, value, true); - inputView.btnState.Text = str; - } - break; - case SPK.DoorLock: - { - string value = this.GetValue(dicList); - if (value == "open") - { - inputView.btnState.Text = Language.StringByID(StringId.kaiqi); - } - } - break; - case SPK.VideoDoorLock: - { - string s = string.Empty; - string tag = string.Empty; - for (int b = 0; b < dicList.Count; b++) - { - var dic = dicList[b]; - //var userId = dic["value"].ToString(); - //var FaceItem = this.GetVideoDoorLockUserItem(userId, device); - //s += FaceItem.userName; - //s += ","; - //tag += FaceItem.userId; - //tag += "_"; - var userName = dic["value"].ToString(); - s += userName; - s += ","; - } - inputView.btnState.Text = s; - } - break; - case SPK.doorgate: - { - string s = string.Empty; - if (inputCondition.identifier == "door_call_cloud_event") - { - s = Language.StringByID(StringId.shipintonghuahujiao); - } - else - { - for (int b = 0; b < dicList.Count; b++) - { - var dic = dicList[b]; - var key = dic["key"].ToString(); - if (key != "user_id") - { - continue; - } - var userId = dic["value"].ToString(); - var FaceItem = this.GetFaceItem(userId, device.deviceId); - s += FaceItem.userName; - s += ","; - - - } - - } - inputView.btnState.Text = s; - } - break; - case SPK.IpCam_Imou: - { - if (inputCondition.identifier == "ipcam_region_alram_event") - { - inputView.btnState.Text = Language.StringByID(StringId.quyuruqingaojing); - } - - } - break; - case SPK.Ev_Ipcam: - if (inputCondition.identifier == "motiondetect_event") - { - inputView.btnState.Text = Language.StringByID(StringId.shi); - } - break; - case SPK.Peephole: - if (inputCondition.identifier == "pir_event") - { - inputView.btnState.Text = Language.StringByID(StringId.shi); - } - break; - case SPK.SensorPirHold: - { - string value = this.GetKeyValue("people_status", dicList); - if (string.IsNullOrEmpty(value)) - { - inputView.btnState.Text = inputCondition.hold_time + "s"; - break; - - } - - inputView.btnState.Text = Language.StringByID(StringId.wuren); - if (value == "true") - { - inputView.btnState.Text = Language.StringByID(StringId.youren); - - } - if (!string.IsNullOrEmpty(inputCondition.hold_time) && int.Parse(inputCondition.hold_time) > 0) - { - - inputView.btnState.Text += "鎸佺画" + inputCondition.hold_time + "s"; - } - - } break; } @@ -747,124 +420,10 @@ { //鐢╯id鎵惧埌璁惧锛� var device = LogicMethod.Current.GetDevice(inputCondition.sid); - if (device.spk == SPK.SensorEnvironment || device.spk == SPK.SensorEnvironmentHailin - || device.spk == SPK.SensorEnvironment2 - || device.spk == SPK.SensorEnvironment3 - ) - { - ///褰撳墠鐨勭储寮曞�兼暟鎹璞� - Input inputedit = Logic.currlogic.input[indexVulae]; - ///鐘舵�佸�� - string stateValue = ""; - foreach (var dic in inputedit.condition) - { - string key = dic["key"]; - string comparator = dic["comparator"]; - stateValue = dic["value"]; - switch (key) - { - - case "temperature": - { - int titleInt = 0; - if (comparator == ">") - { - titleInt = StringId.wendugaoyu; - } - else if (comparator == "<") - { - titleInt = StringId.wendudiyu; - } - ConditionDeviceFunList.Current.InputBoxAction(device, titleInt, indexVulae, true, stateValue); - } - break; - case "humidity": - { - int titleInt = 0; - if (comparator == ">") - { - titleInt = StringId.shidugaoyu; - } - else if (comparator == "<") - { - titleInt = StringId.shidudiyu; - } - ConditionDeviceFunList.Current.InputBoxAction(device, titleInt, indexVulae, true, stateValue); - } - break; - case "co2": - { - ConditionDeviceFunList.Current.PmCo2TvocAction(thisView, device, "co2", StringId.co2, indexVulae, true, stateValue); - } - break; - case "pm25": - { - ConditionDeviceFunList.Current.PmCo2TvocAction(thisView, device, "pm25", StringId.pm25, indexVulae, true, stateValue); - } - break; - case "tvoc": - { - ConditionDeviceFunList.Current.PmCo2TvocAction(thisView, device, "tvoc", StringId.tvoc, indexVulae, true, stateValue); - } - break; - case "hcho": - { - ConditionDeviceFunList.Current.PmCo2TvocAction(thisView, device, "hcho", StringId.Formaldehyde, indexVulae, true, stateValue); - } - break; - } - } - - } - else if (device.spk == SPK.SensorTemperature) - { - - this.SensorView(thisView, device, "temperature", indexVulae); - - } - else if (device.spk == SPK.SensorHumidity) - { - - this.SensorView(thisView, device, "humidity", indexVulae); - - } - else if (device.spk == SPK.SensorCO2) - { - - this.SensorView(thisView, device, "co2", indexVulae); - - } - else if (device.spk == SPK.SensorPm10) - { - - this.SensorView(thisView, device, "pm10", indexVulae); - - } - else if (device.spk == SPK.SensorPm25) - { - - this.SensorView(thisView, device, "pm25", indexVulae); - - } - else if (device.spk == SPK.SensorTVOC) - { - - this.SensorView(thisView, device, "tvoc", indexVulae); - - } - else if (device.spk == SPK.SensorHcho) - { - - this.SensorView(thisView, device, "hcho", indexVulae); - - } - else - { - ConditionDeviceFunList deviceFunList = new ConditionDeviceFunList(); - MainPage.BasePageView.AddChidren(deviceFunList); - deviceFunList.Show(device, indexVulae, edit); - MainPage.BasePageView.PageIndex = MainPage.BasePageView.ChildrenCount - 1; - } + ConditionDeviceFunList deviceFunList = new ConditionDeviceFunList(); + MainPage.BasePageView.AddChidren(deviceFunList); + deviceFunList.Show(device, indexVulae, edit); + MainPage.BasePageView.PageIndex = MainPage.BasePageView.ChildrenCount - 1; } break; case "6": @@ -1016,30 +575,7 @@ switch (device.spk) { - case SPK.CommonSeries: - targetView.btnIcon.UnSelectedImagePath = "FunctionIcon/Icon/groupControl.png"; - stateStr = GetKeyValue("on_off", dicList) == "on" ? Language.StringByID(StringId.onLogic) : Language.StringByID(StringId.offLogic); - break; - //鎻掑骇(鏈塙SB) - case SPK.PanelSocket: - { - string on_off = GetKeyValue("on_off_master", dicList); - if (on_off == "on") - { - stateStr = Language.StringByID(StringId.onLogic); - } - else - { - stateStr = stateStr = Language.StringByID(StringId.offLogic); - } - } - break; - case SPK.AirSwitch: case SPK.LightSwitch: - //鎻掑骇 - case SPK.ElectricSocket: - //鏈烘鎵� - case SPK.MechanicalArm: {//寮�鍏� foreach (var dic in dicList) @@ -1057,8 +593,6 @@ } } break; - - case SPK.LightRGB: case SPK.LightRGBW: case SPK.LightCCT: @@ -1112,62 +646,6 @@ } break; - case SPK.GroupControl: //缇ゆ帶 - { - targetView.btnIcon.UnSelectedImagePath = "FunctionIcon/Icon/groupControl.png"; - string on_off = GetKeyValue("on_off", dicList); - string brightness = GetKeyValue("brightness", dicList); - string cct = GetKeyValue(FunctionAttributeKey.CCT, dicList); - //鑷姩鍖栫粍鎺� 鐐僵鍔熻兘 - //string colorful = GetKeyValue(FunctionAttributeKey.Colorful, dicList); - string rgb = GetKeyValue("rgb", dicList); - - - if (on_off == "on" && brightness != "") - { - stateStr = Language.StringByID(StringId.onLogic) + brightness + "%"; - } - else if (on_off == "on") - { - stateStr = Language.StringByID(StringId.onLogic); - } - else if (on_off == "off") - { - stateStr = Language.StringByID(StringId.offLogic); - } - else if (brightness != "") - { - stateStr = brightness + "%"; - } - //鑹叉俯杩欎釜灞炴�ф墠鏈夋晥 - if (!string.IsNullOrEmpty(cct)) - { - stateStr += "," + Language.StringByID(StringId.ColorTemperature) + cct + "k"; - } - - //if (!string.IsNullOrEmpty(colorful)) - //{ - // stateStr += "," + Language.StringByID(StringId.ColorfulFunction); - // if (colorful == "on") - // { - // stateStr += Language.StringByID(StringId.onLogic); - // } - // else if (colorful == "off") - // { - // stateStr += Language.StringByID(StringId.offLogic); - // } - //} - - if (!string.IsNullOrEmpty(rgb) && rgb.Length > 6) - { - targetView.btnStateColor.Visible = true; - targetView.btnStateColor.BackgroundColor = new LogicView.RGBColorView().GetBackgroundColor(rgb); - } - - - } - break; - case SPK.CurtainSwitch: { foreach (var dic in dicList) @@ -1470,21 +948,6 @@ } } break; - case SPK.MusicStandard: - case SPK.AvMusic: - { - string song_name = GetKeyValue("song_name", dicList); - string volume = GetKeyValue("volume", dicList); - stateStr = song_name + ";" +Language.StringByID(StringId.volumeMusic)+volume; - if (stateStr.StartsWith(";")) - { - stateStr = stateStr.Substring(1, stateStr.Length - 1); - }else if (stateStr.EndsWith(Language.StringByID(StringId.volumeMusic))) - { - stateStr = stateStr.Substring(0, stateStr.Length - 3); - } - } - break; } } break; @@ -1499,25 +962,6 @@ } break; case "3": - { - //鐢╯id鎵惧埌瀹夐槻锛� - var security = LogicMethod.Current.GetSecurity(outputTarget.sid); - targetView.btnIcon.UnSelectedImagePath = "LogicIcon/security.png"; - targetView.btnDelay.Visible = false; - //鏄剧ず瀹夐槻鍚嶇О - targetView.btnText.Text = security.name; - string value = GetKeyValue("security", dicList); - if (value == "enable") - { - stateStr = Language.StringByID(StringId.bufang); - - } - else - { - stateStr = Language.StringByID(StringId.chefang); - } - - } break; case "4": { @@ -1634,29 +1078,7 @@ { switch (device.spk) { - //鎻掑骇(鏈塙SB) - case SPK.PanelSocket: - { - foreach (var dic in dicList) - { - string value = dic["value"]; - if (value == "on") - { - button1.Text = Language.StringByID(StringId.onLogic); - } - else - { - button1.Text = Language.StringByID(StringId.offLogic); - } - } - } - break; - case SPK.ElectricSocket: - //寮�鍏崇伅鍏� - case SPK.AirSwitch: case SPK.LightSwitch: - //鏈烘鎵� - case SPK.MechanicalArm: { foreach (var dic in dicList) { @@ -1733,73 +1155,6 @@ } } - } - break; - case SPK.GroupControl://缇ゆ帶 - { - foreach (var dic in dicList) - { - string key = dic["key"]; - if (key != attribute) - { - continue; - } - string value = dic["value"]; - switch (key) - { - case "on_off": - case "colorful": - { - if (value == "on") - { - button1.Text = Language.StringByID(StringId.onLogic); - } - else - { - button1.Text = Language.StringByID(StringId.offLogic); - } - } - break; - case "brightness": - { - if (button1 == null) - { - //鎬曡皟璇曡蒋浠朵贡涓婁笢瑗垮鑷存姏寮傚父 - break; - } - button1.Text = value + "%"; - } - break; - case "cct": - { - if (button1 == null) - { - //鎬曡皟璇曡蒋浠朵贡涓婁笢瑗垮鑷存姏寮傚父 - break; - } - button1.Text = value + "k"; - } - break; - case "rgb": - { - if (button1 == null) - { - //鎬曡皟璇曡蒋浠朵贡涓婁笢瑗垮鑷存姏寮傚父 - break; - } - if (!string.IsNullOrEmpty(value) && value.Length > 6) - { - button1.BackgroundColor = new LogicView.RGBColorView().GetBackgroundColor(value); - button1.Tag = value; - } - } - break; - - - - } - } - } break; case SPK.CurtainSwitch: @@ -2172,290 +1527,6 @@ } break; - case SPK.SensorHelp: - { - foreach (var dic in dicList) - { - string value = dic["value"]; - if (value == "alarm") - { - button1.Text = Language.StringByID(StringId.qiujiu); - } - else - { - button1.Text = Language.StringByID(StringId.zhengchang); - } - } - } - break; - - case SPK.SensorGas: - case SPK.SensorSmoke: - { - foreach (var dic in dicList) - { - string value = dic["value"]; - if (value == "alarm") - { - button1.Text = Language.StringByID(StringId.xieluo); - } - else - { - button1.Text = Language.StringByID(StringId.wuxieluo); - } - } - } - break; - case SPK.SensorWater: - { - foreach (var dic in dicList) - { - string value = dic["value"]; - if (value == "alarm") - { - button1.Text = Language.StringByID(StringId.luoshui); - } - else - { - button1.Text = Language.StringByID(StringId.wuluoshui); - } - } - } - break; - case SPK.SensorDryContact: - case SPK.SensorDryContact2: - { - foreach (var dic in dicList) - { - string value = dic["value"]; - if (value == "on") - { - button1.Text = Language.StringByID(StringId.onLogic); - } - else - { - button1.Text = Language.StringByID(StringId.offLogic); - } - } - } - break; - case SPK.SensorShanLan: - case SPK.SensorDuiShe: - case SPK.SensorPir: - { - foreach (var dic in dicList) - { - string value = dic["value"]; - if (value == "true") - { - button1.Text = Language.StringByID(StringId.youren); - } - else - { - button1.Text = Language.StringByID(StringId.wuren); - } - } - } - break; - case SPK.SensorPirHold: - { - foreach (var dic in dicList) - { - string value = dic["value"]; - if (value == "true") - { - button1.Text = Language.StringByID(StringId.youren); - } - else - { - button1.Text = Language.StringByID(StringId.wuren); - } - } - - } - break; - case SPK.SensorDoorWindow: - { - foreach (var dic in dicList) - { - string value = dic["value"]; - if (value == "open") - { - button1.Text = Language.StringByID(StringId.kaiqi); - } - else - { - button1.Text = Language.StringByID(StringId.bihe); - } - } - } - break; - case SPK.SensorUtrasonic: - { - foreach (var dic in dicList) - { - string value = dic["value"]; - switch (dic["key"]) - { - case "status": - case "people_status": - { - if (value == "true") - { - button1.Text = Language.StringByID(StringId.youren); - } - else - { - button1.Text = Language.StringByID(StringId.wuren); - } - - - } - break; - case "dismantle": - { - if (value == "true") - { - button2.Text = Language.StringByID(StringId.zaixian); - } - else - { - button2.Text = Language.StringByID(StringId.buzaixian); - } - } - break; - - } - - } - } - break; - case SPK.SenesorMegahealth: - case SPK.SensorMmvPose: - { - foreach (var dic in dicList) - { - string value = dic["value"]; - switch (dic["key"]) - { - - case "target_status": - { - if (value == "4") - { - button1.Text = Language.StringByID(StringId.shi); - } - } - break; - case "people_status": - { - if (value == "true") - { - button2.Text = Language.StringByID(StringId.youren); - } - else - { - button2.Text = Language.StringByID(StringId.wuren); - } - - } - break; - } - - } - } - break; - case SPK.SenesorMegahealth2: - { - foreach (var dic in dicList) - { - string value = dic["value"]; - if (value == "fall") - { - button1.Text = Language.StringByID(StringId.diedao); - } - else - { - button1.Text = Language.StringByID(StringId.wuren); - } - } - } - break; - case SPK.DoorLock: - { - foreach (var dic in dicList) - { - string value = dic["value"]; - if (value == "open") - { - button1.Text = Language.StringByID(StringId.shi); - } - - } - } - break; - case SPK.VideoDoorLock: - { - string s = string.Empty; - string tag = string.Empty; - for (int b = 0; b < dicList.Count; b++) - { - var dic = dicList[b]; - //var userId = dic["value"].ToString(); - //var FaceItem = this.GetVideoDoorLockUserItem(userId, device); - //s += FaceItem.userName; - //s += ","; - //tag += FaceItem.userId; - //tag += "_"; - var userName = dic["value"].ToString(); - s += userName; - s += ","; - } - button1.Text = s; - button1.Tag = tag; - } - break; - - - case SPK.MusicStandard: - case SPK.AvMusic: - { - foreach (var dic in dicList) - { - if (dic["key"] == "song_name") - { - button1.Text = dic["value"]?.ToString(); - } - else if (dic["key"] == "volume") - { - button2.Text = dic["value"]?.ToString(); - } - } - } - break; - case SPK.doorgate: - { - string s = string.Empty; - string tag = string.Empty; - for (int b = 0; b < dicList.Count; b++) - { - var dic = dicList[b]; - var key = dic["key"].ToString(); - if (key != "user_id") - { - continue; - } - var userId = dic["value"].ToString(); - var FaceItem = this.GetFaceItem(userId, device.deviceId); - s += FaceItem.userName; - s += ","; - tag += FaceItem.userId; - tag += "_"; - } - button2.Text = s; - button2.Tag = tag; - } - break; } } @@ -2584,8 +1655,6 @@ //鍖哄埆涓嶅悓璁惧锛屾樉绀轰笉鍚岃澶囩姸鎬� switch (device.spk) { - case SPK.MechanicalArm: - case SPK.AirSwitch: case SPK.LightSwitch: {//寮�鍏崇伅 string value = this.GetValue(dicList); @@ -2680,12 +1749,6 @@ } break; case "3": - { - //鐢╯id鎵惧埌瀹夐槻锛� - var security = LogicMethod.Current.GetSecurity(outputTarget.sid); - name += security.name; - - } break; } @@ -2968,7 +2031,7 @@ { if (Send.Current.VideoDoorLockUserListInfo.Count == 0) { - Send.Current.GetVideoDoorLockUserListInfo(device); + //Send.Current.GetVideoDoorLockUserListInfo(device); } var face = Send.Current.VideoDoorLockUserListInfo.Find((o) => { return o.userId == userId; }); if (face == null) -- Gitblit v1.8.0