wxr
2023-07-17 23d7cefd31bd431dd177b3b5267331e070c5fc5f
视频门锁
10个文件已添加
15个文件已修改
1033 ■■■■■ 已修改文件
HDL-ON_Android/Assets/Language.ini 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HDL-ON_Android/Assets/Phone/FunctionIcon/DoorLock/DoorlockHelpImage1.png 补丁 | 查看 | 原始文档 | blame | 历史
HDL-ON_Android/Assets/Phone/FunctionIcon/DoorLock/DoorlockHelpImage2.png 补丁 | 查看 | 原始文档 | blame | 历史
HDL-ON_Android/Assets/Phone/FunctionIcon/DoorLock/DoorlockHelpImage3.png 补丁 | 查看 | 原始文档 | blame | 历史
HDL-ON_Android/Assets/Phone/FunctionIcon/DoorLock/DoorlockHelpImage4.png 补丁 | 查看 | 原始文档 | blame | 历史
HDL-ON_Android/HDL-ON_Android.csproj 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HDL-ON_iOS/HDL-ON_iOS.csproj 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HDL-ON_iOS/Resources/Language.ini 149 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HDL-ON_iOS/Resources/Phone/FunctionIcon/DoorLock/DoorlockHelpImage1.png 补丁 | 查看 | 原始文档 | blame | 历史
HDL-ON_iOS/Resources/Phone/FunctionIcon/DoorLock/DoorlockHelpImage2.png 补丁 | 查看 | 原始文档 | blame | 历史
HDL-ON_iOS/Resources/Phone/FunctionIcon/DoorLock/DoorlockHelpImage3.png 补丁 | 查看 | 原始文档 | blame | 历史
HDL-ON_iOS/Resources/Phone/FunctionIcon/DoorLock/DoorlockHelpImage4.png 补丁 | 查看 | 原始文档 | blame | 历史
HDL_ON/Common/HDLCommon.cs 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HDL_ON/Common/R.cs 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HDL_ON/DAL/Server/HttpServerRequest.cs 63 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HDL_ON/DAL/Server/NewAPI.cs 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HDL_ON/DAL/ThirdPartySdk/HDLLinphone.cs 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HDL_ON/Entity/Function/Scene.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
HDL_ON/HDL_ON.projitems 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HDL_ON/UI/MainPage.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
HDL_ON/UI/UI2/FuntionControlView/VideoDoorLock/CommonMethod.cs 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HDL_ON/UI/UI2/FuntionControlView/VideoDoorLock/UnlockSettingFacePage.cs 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HDL_ON/UI/UI2/FuntionControlView/VideoDoorLock/VideoDoorlockAudioSetupPage.cs 444 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HDL_ON/UI/UI2/FuntionControlView/VideoDoorLock/VideoDoorlockFaceUnlockHelpPage.cs 160 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HDL_ON/UI/UI2/FuntionControlView/VideoDoorLock/VideoDoorlockFaceUnlockTriggerSettingPage.cs 92 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HDL-ON_Android/Assets/Language.ini
@@ -657,6 +657,12 @@
670=After entering the detection range, the door lock will automatically recognize the face and unlock it
671=Note: The distance for recognizing faces is affected by the trigger sensitivity, and the higher the sensitivity, the farther the recognition distance.
672=Need to touch the door lock number button, wake up the door lock, recognize the face, and unlock it
673=Door lock system volume
674=Doorbell volume
675=Low
676=Moderate
677=High
@@ -1987,7 +1993,11 @@
670=进入检测范围后,门锁将自动识别人脸并开锁
671=注:识别人脸的距离,会受触发灵敏度影响,灵敏度越高,识别距离越远。
672=需要触摸门锁数字按键,唤醒门锁后识别人脸并开锁
673=门锁系统音量
674=门铃音量
675=低
676=中
677=高
2532=访客邀请记录
@@ -3316,6 +3326,12 @@
670=After entering the detection range, the door lock will automatically recognize the face and unlock it
671=Note: The distance for recognizing faces is affected by the trigger sensitivity, and the higher the sensitivity, the farther the recognition distance.
672=Need to touch the door lock number button, wake up the door lock, recognize the face, and unlock it
673=Door lock system volume
674=Doorbell volume
675=Low
676=Moderate
677=High
@@ -4642,6 +4658,12 @@
670=After entering the detection range, the door lock will automatically recognize the face and unlock it
671=Note: The distance for recognizing faces is affected by the trigger sensitivity, and the higher the sensitivity, the farther the recognition distance.
672=Need to touch the door lock number button, wake up the door lock, recognize the face, and unlock it
673=Door lock system volume
674=Doorbell volume
675=Low
676=Moderate
677=High
@@ -5955,6 +5977,12 @@
670=After entering the detection range, the door lock will automatically recognize the face and unlock it
671=Note: The distance for recognizing faces is affected by the trigger sensitivity, and the higher the sensitivity, the farther the recognition distance.
672=Need to touch the door lock number button, wake up the door lock, recognize the face, and unlock it
673=Door lock system volume
674=Doorbell volume
675=Low
676=Moderate
677=High
HDL-ON_Android/Assets/Phone/FunctionIcon/DoorLock/DoorlockHelpImage1.png
HDL-ON_Android/Assets/Phone/FunctionIcon/DoorLock/DoorlockHelpImage2.png
HDL-ON_Android/Assets/Phone/FunctionIcon/DoorLock/DoorlockHelpImage3.png
HDL-ON_Android/Assets/Phone/FunctionIcon/DoorLock/DoorlockHelpImage4.png
HDL-ON_Android/HDL-ON_Android.csproj
@@ -450,6 +450,10 @@
    <AndroidAsset Include="Assets\Phone\FunctionIcon\DoorLock\ManualTriggerIcon_blue.png" />
    <AndroidAsset Include="Assets\Phone\FunctionIcon\DoorLock\ManualTriggerIcon_white.png" />
    <AndroidAsset Include="Assets\Phone\FunctionIcon\DoorLock\TouchUnlcokImage.png" />
    <AndroidAsset Include="Assets\Phone\FunctionIcon\DoorLock\DoorlockHelpImage1.png" />
    <AndroidAsset Include="Assets\Phone\FunctionIcon\DoorLock\DoorlockHelpImage2.png" />
    <AndroidAsset Include="Assets\Phone\FunctionIcon\DoorLock\DoorlockHelpImage3.png" />
    <AndroidAsset Include="Assets\Phone\FunctionIcon\DoorLock\DoorlockHelpImage4.png" />
  </ItemGroup>
  <ItemGroup>
    <AndroidResource Include="Resources\values\colors.xml" />
HDL-ON_iOS/HDL-ON_iOS.csproj
@@ -1610,6 +1610,10 @@
      <BundleResource Include="Resources\Phone\FunctionIcon\DoorLock\ManualTriggerIcon_blue.png" />
      <BundleResource Include="Resources\Phone\FunctionIcon\DoorLock\ManualTriggerIcon_white.png" />
      <BundleResource Include="Resources\Phone\FunctionIcon\DoorLock\TouchUnlcokImage.png" />
      <BundleResource Include="Resources\Phone\FunctionIcon\DoorLock\DoorlockHelpImage1.png" />
      <BundleResource Include="Resources\Phone\FunctionIcon\DoorLock\DoorlockHelpImage2.png" />
      <BundleResource Include="Resources\Phone\FunctionIcon\DoorLock\DoorlockHelpImage3.png" />
      <BundleResource Include="Resources\Phone\FunctionIcon\DoorLock\DoorlockHelpImage4.png" />
    </ItemGroup>
    <ItemGroup>
      <ITunesArtwork Include="iTunesArtwork" />
HDL-ON_iOS/Resources/Language.ini
@@ -634,6 +634,36 @@
647=Face key
648=Delete user
649=Activity detection
650=Do you want to delete this user?
651=Successfully deleted
652=Unlock settings
653=Face unlock settings
654=Press the button to unlock twice
655=To unlock indoors, press the unlock button twice to prevent children or pets from accidentally touching the lock
656=Child lock mode
657=After opening, the door cannot be unlocked through buttons, only the emergency knob can be used to unlock
658=Anti lock mode
659=After opening, ordinary users cannot unlock, while the main user can still unlock. After opening the door with the indoor button, the anti lock mode will automatically close
660=Deployment mode
661=It is recommended to change the mode when leaving home for a long time. It can also be activated by pressing the blue button that lights up on the door lock keyboard after closing the door
662=Audio settings
663=Battery management
664=Face unlocking
665=After opening, the device can perform facial recognition and unlock
666=Trigger mode
667=Face entry help
668=Manual triggering
669=Automatic triggering
670=After entering the detection range, the door lock will automatically recognize the face and unlock it
671=Note: The distance for recognizing faces is affected by the trigger sensitivity, and the higher the sensitivity, the farther the recognition distance.
672=Need to touch the door lock number button, wake up the door lock, recognize the face, and unlock it
673=Door lock system volume
674=Doorbell volume
675=Low
676=Moderate
677=High
@@ -1940,7 +1970,34 @@
647=人脸钥匙
648=删除用户
649=活动检测
650=是否删除该用户?
651=删除成功
652=开锁设置
653=人脸开锁设置
654=按键两次开锁
655=室内开锁,需按两次开锁键,以防儿童、宠物误触开锁
656=童锁模式
657=开启后,室内不能通过按键开锁,仅可使用应急旋钮开锁
658=反锁模式
659=开启后,普通用户不可开锁,主用户仍可开锁,室内按键开门后反锁模式将自动关闭
660=布防模式
661=长期离家建议开启改模式,也可通过关门后按压门锁键盘亮起的蓝色按键开启
662=音频设置
663=电池管理
664=人脸开锁
665=开启后,设备可以进行人脸识别开锁
666=触发方式
667=人脸录入帮助
668=手动触发
669=自动触发
670=进入检测范围后,门锁将自动识别人脸并开锁
671=注:识别人脸的距离,会受触发灵敏度影响,灵敏度越高,识别距离越远。
672=需要触摸门锁数字按键,唤醒门锁后识别人脸并开锁
673=门锁系统音量
674=门铃音量
675=低
676=中
677=高
2532=访客邀请记录
@@ -3246,6 +3303,37 @@
647=Face key
648=Delete user
649=Activity detection
650=Do you want to delete this user?
651=Successfully deleted
652=Unlock settings
653=Face unlock settings
654=Press the button to unlock twice
655=To unlock indoors, press the unlock button twice to prevent children or pets from accidentally touching the lock
656=Child lock mode
657=After opening, the door cannot be unlocked through buttons, only the emergency knob can be used to unlock
658=Anti lock mode
659=After opening, ordinary users cannot unlock, while the main user can still unlock. After opening the door with the indoor button, the anti lock mode will automatically close
660=Deployment mode
661=It is recommended to change the mode when leaving home for a long time. It can also be activated by pressing the blue button that lights up on the door lock keyboard after closing the door
662=Audio settings
663=Battery management
664=Face unlocking
665=After opening, the device can perform facial recognition and unlock
666=Trigger mode
667=Face entry help
668=Manual triggering
669=Automatic triggering
670=After entering the detection range, the door lock will automatically recognize the face and unlock it
671=Note: The distance for recognizing faces is affected by the trigger sensitivity, and the higher the sensitivity, the farther the recognition distance.
672=Need to touch the door lock number button, wake up the door lock, recognize the face, and unlock it
673=Door lock system volume
674=Doorbell volume
675=Low
676=Moderate
677=High
@@ -4547,6 +4635,36 @@
647=Face key
648=Delete user
649=Activity detection
650=Do you want to delete this user?
651=Successfully deleted
652=Unlock settings
653=Face unlock settings
654=Press the button to unlock twice
655=To unlock indoors, press the unlock button twice to prevent children or pets from accidentally touching the lock
656=Child lock mode
657=After opening, the door cannot be unlocked through buttons, only the emergency knob can be used to unlock
658=Anti lock mode
659=After opening, ordinary users cannot unlock, while the main user can still unlock. After opening the door with the indoor button, the anti lock mode will automatically close
660=Deployment mode
661=It is recommended to change the mode when leaving home for a long time. It can also be activated by pressing the blue button that lights up on the door lock keyboard after closing the door
662=Audio settings
663=Battery management
664=Face unlocking
665=After opening, the device can perform facial recognition and unlock
666=Trigger mode
667=Face entry help
668=Manual triggering
669=Automatic triggering
670=After entering the detection range, the door lock will automatically recognize the face and unlock it
671=Note: The distance for recognizing faces is affected by the trigger sensitivity, and the higher the sensitivity, the farther the recognition distance.
672=Need to touch the door lock number button, wake up the door lock, recognize the face, and unlock it
673=Door lock system volume
674=Doorbell volume
675=Low
676=Moderate
677=High
@@ -5836,6 +5954,35 @@
647=Face key
648=Delete user
649=Activity detection
650=Do you want to delete this user?
651=Successfully deleted
652=Unlock settings
653=Face unlock settings
654=Press the button to unlock twice
655=To unlock indoors, press the unlock button twice to prevent children or pets from accidentally touching the lock
656=Child lock mode
657=After opening, the door cannot be unlocked through buttons, only the emergency knob can be used to unlock
658=Anti lock mode
659=After opening, ordinary users cannot unlock, while the main user can still unlock. After opening the door with the indoor button, the anti lock mode will automatically close
660=Deployment mode
661=It is recommended to change the mode when leaving home for a long time. It can also be activated by pressing the blue button that lights up on the door lock keyboard after closing the door
662=Audio settings
663=Battery management
664=Face unlocking
665=After opening, the device can perform facial recognition and unlock
666=Trigger mode
667=Face entry help
668=Manual triggering
669=Automatic triggering
670=After entering the detection range, the door lock will automatically recognize the face and unlock it
671=Note: The distance for recognizing faces is affected by the trigger sensitivity, and the higher the sensitivity, the farther the recognition distance.
672=Need to touch the door lock number button, wake up the door lock, recognize the face, and unlock it
673=Door lock system volume
674=Doorbell volume
675=Low
676=Moderate
677=High
HDL-ON_iOS/Resources/Phone/FunctionIcon/DoorLock/DoorlockHelpImage1.png
HDL-ON_iOS/Resources/Phone/FunctionIcon/DoorLock/DoorlockHelpImage2.png
HDL-ON_iOS/Resources/Phone/FunctionIcon/DoorLock/DoorlockHelpImage3.png
HDL-ON_iOS/Resources/Phone/FunctionIcon/DoorLock/DoorlockHelpImage4.png
HDL_ON/Common/HDLCommon.cs
@@ -258,12 +258,12 @@
        {
            try
            {
                MainPage.Log($"接收到推送");
                MainPage.Log($"接收到推送.\r\n{Newtonsoft.Json.JsonConvert.SerializeObject(jpushMessageInfo).ToString()}");
                //Extras为空不处理
                if (string.IsNullOrEmpty(jpushMessageInfo.Extras)) return;
                if (jpushMessageInfo.Extras.Contains(PushMessageType.OffLine.ToString()))
                if (jpushMessageInfo.Extras == (PushMessageType.OffLine.ToString()))
                {
                    CheckLogout();
                }
@@ -275,14 +275,14 @@
                    if (string.IsNullOrEmpty(jpushMessageInfo.messageType)) return;
                    //报警推送才弹窗提示(messageType包含Alarm关键字的)
                    if (jpushMessageInfo.messageType.Contains(PushMessageType.Alarm.ToString()))
                    if (jpushMessageInfo.messageType == (PushMessageType.Alarm.ToString()))
                    {
                        //报警推送弹窗提示
                        ShowAlarmPushMessage(jpushMessageInfo, true);
                        //萤石门锁推送
                        HDL_ON.UI.UI2.FuntionControlView.VideoDoorLock.CommonMethod.Current.DoorLockPush(jpushMessageInfo);
                    }
                    else if (jpushMessageInfo.messageType.Contains(PushMessageType.FLCall.ToString()))
                    else if (jpushMessageInfo.messageType == (PushMessageType.FLCall.ToString()))
                    {
                        if (string.IsNullOrEmpty(jpushMessageInfo.expantContent)) return;
@@ -305,7 +305,7 @@
                        ESOnVideo.Current.ShowESvideoVideoIntercom(eSVideoInfo, InterphoneType.FLVI.ToString());
                    }
                    else if (jpushMessageInfo.messageType.Contains(PushMessageType.HDL_INTERPHONE.ToString()))
                    else if (jpushMessageInfo.messageType == (PushMessageType.HDL_INTERPHONE.ToString()))
                    {
                        if (string.IsNullOrEmpty(jpushMessageInfo.expantContent)) return;
@@ -314,7 +314,16 @@
                        var json = Newtonsoft.Json.Linq.JObject.Parse(jpushMessageInfo.expantContent);
                        try
                        {
                            //var pushHomeId = json["homeId"];
                            //if (pushHomeId == null || string.IsNullOrEmpty(pushHomeId.ToString())){
                            //    Console.WriteLine("homeId is null");
                            //    return;
                            //}
                            var pushTime = json["pushTime"];
                            if(pushTime == null)
                            {
                                return;
                            }
                            if (!string.IsNullOrEmpty(pushTime.ToString()))
                            {
                                var pushDateTime = Utlis.UnixToDateTimeMS(Convert.ToInt64(pushTime));
@@ -386,13 +395,13 @@
                        ESOnVideo.Current.ShowESvideoVideoIntercom(eSVideoInfo, interphoneTypeEnum);
                    }
                    else if (jpushMessageInfo.messageType.Contains(PushMessageType.Prompt.ToString()))
                    else if (jpushMessageInfo.messageType == (PushMessageType.Prompt.ToString()))
                    {
                        ShowAlarmPushMessage(jpushMessageInfo, false);
                        //萤石门锁推送
                        HDL_ON.UI.UI2.FuntionControlView.VideoDoorLock.CommonMethod.Current.DoorLockPush(jpushMessageInfo);
                    }
                    else if (jpushMessageInfo.messageType.Contains(PushMessageType.DOOR_BELL.ToString()))
                    else if (jpushMessageInfo.messageType == (PushMessageType.DOOR_BELL.ToString()))
                    {
                        //萤石门锁推送
                        HDL_ON.UI.UI2.FuntionControlView.VideoDoorLock.CommonMethod.Current.DoorLockPush(jpushMessageInfo);
HDL_ON/Common/R.cs
@@ -4,7 +4,26 @@
{
    public static class StringId
    {
        /// <summary>
        /// 高
        /// </summary>
        public const int High = 677;
        /// <summary>
        /// 中
        /// </summary>
        public const int Moderate = 676;
        /// <summary>
        /// 低
        /// </summary>
        public const int Low = 675;
        /// <summary>
        /// 门铃音量
        /// </summary>
        public const int DoorbellVolume = 674;
        /// <summary>
        /// 门锁系统音量
        /// </summary>
        public const int DoorlockSystemVolume = 673;
        /// <summary>
        /// 需要触摸门锁数字按键,唤醒门锁后识别人脸并开锁
        /// </summary>
HDL_ON/DAL/Server/HttpServerRequest.cs
@@ -3384,6 +3384,69 @@
            return HttpUtil.RequestHttpsPostFroHome(NewAPI.Api_Post_SetFaceRecognitionUnlockCfg, requestJson);
        }
        /// <summary>
        /// 查询门锁系统声音
        /// </summary>
        /// <param name="deviceId"></param>
        /// <returns></returns>
        public ResponsePackNew GetDoorLockSystemSound(string deviceId)
        {
            var d = new Dictionary<string, object>();
            d.Add("homeId", DB_ResidenceData.Instance.CurrentRegion.id);
            d.Add("deviceId", deviceId);
            var requestJson = HttpUtil.GetSignRequestJson(d);
            return HttpUtil.RequestHttpsPostFroHome(NewAPI.Api_Post_GetDoorLockSystemSound, requestJson);
        }
        /// <summary>
        /// 设置门锁系统声音
        /// </summary>
        /// <param name="deviceId"></param>
        /// <param name="sound"></param>
        /// <returns></returns>
        public ResponsePackNew SetDoorLockSystemSound(string deviceId,string sound)
        {
            var d = new Dictionary<string, object>();
            d.Add("homeId", DB_ResidenceData.Instance.CurrentRegion.id);
            d.Add("deviceId", deviceId);
            d.Add("sound", sound);
            var requestJson = HttpUtil.GetSignRequestJson(d);
            return HttpUtil.RequestHttpsPostFroHome(NewAPI.Api_Post_SetDoorLockSystemSound, requestJson);
        }
        /// <summary>
        /// 查询门铃提示音
        /// </summary>
        /// <param name="deviceId"></param>
        /// <returns></returns>
        public ResponsePackNew GetDoorBellTone(string deviceId)
        {
            var d = new Dictionary<string, object>();
            d.Add("homeId", DB_ResidenceData.Instance.CurrentRegion.id);
            d.Add("deviceId", deviceId);
            var requestJson = HttpUtil.GetSignRequestJson(d);
            return HttpUtil.RequestHttpsPostFroHome(NewAPI.Api_Post_GetDoorBellTone, requestJson);
        }
        /// <summary>
        /// 设置门铃提示音
        /// </summary>
        /// <param name="deviceId"></param>
        /// <param name="volume"></param>
        /// <returns></returns>
        public ResponsePackNew SetDoorBellTone(string deviceId, string volume)
        {
            var d = new Dictionary<string, object>();
            d.Add("homeId", DB_ResidenceData.Instance.CurrentRegion.id);
            d.Add("deviceId", deviceId);
            d.Add("volume", volume);
            var requestJson = HttpUtil.GetSignRequestJson(d);
            return HttpUtil.RequestHttpsPostFroHome(NewAPI.Api_Post_SetDoorBellTone, requestJson);
        }
        #endregion
        #endregion
HDL_ON/DAL/Server/NewAPI.cs
@@ -965,6 +965,22 @@
        /// 设置人脸识别解锁配置
        /// </summary>
        public const string Api_Post_SetFaceRecognitionUnlockCfg = "/home-wisdom/platform/yingshi/lock/setFaceRecognitionUnlockCfg";
        /// <summary>
        /// 查询门锁系统声音
        /// </summary>
        public const string Api_Post_GetDoorLockSystemSound = "/home-wisdom/platform/yingshi/lock/getDoorLockSystemSound";
        /// <summary>
        /// 设置门锁系统声音
        /// </summary>
        public const string Api_Post_SetDoorLockSystemSound = "/home-wisdom/platform/yingshi/lock/setDoorLockSystemSound";
        /// <summary>
        /// 查询门铃提示音
        /// </summary>
        public const string Api_Post_GetDoorBellTone = "/home-wisdom/platform/yingshi/lock/getDoorBellTone";
        /// <summary>
        /// 设置门铃提示音
        /// </summary>
        public const string Api_Post_SetDoorBellTone = "/home-wisdom/platform/yingshi/lock/setDoorBellTone";
HDL_ON/DAL/ThirdPartySdk/HDLLinphone.cs
@@ -358,6 +358,10 @@
                Application.RunOnMainThread(() =>
                {
                    if(revertObj == null)
                    {
                        return;
                    }
#if __IOS__
                    if (revertObj.Code == StateCode.SUCCESS)
HDL_ON/Entity/Function/Scene.cs
@@ -706,7 +706,7 @@
        /// </summary>
        public string GetUintString()
        {
            if (!string.IsNullOrEmpty(UintString))
            if (!string.IsNullOrEmpty(UintString) && UintString!= "{}")
            {
                return UintString;
            }
HDL_ON/HDL_ON.projitems
@@ -562,6 +562,8 @@
    <Compile Include="$(MSBuildThisFileDirectory)UI\UI2\FuntionControlView\VideoDoorLock\UnlockSettingPage.cs" />
    <Compile Include="$(MSBuildThisFileDirectory)UI\UI2\FuntionControlView\VideoDoorLock\UnlockSettingFacePage.cs" />
    <Compile Include="$(MSBuildThisFileDirectory)UI\UI2\FuntionControlView\VideoDoorLock\VideoDoorlockFaceUnlockTriggerSettingPage.cs" />
    <Compile Include="$(MSBuildThisFileDirectory)UI\UI2\FuntionControlView\VideoDoorLock\VideoDoorlockFaceUnlockHelpPage.cs" />
    <Compile Include="$(MSBuildThisFileDirectory)UI\UI2\FuntionControlView\VideoDoorLock\VideoDoorlockAudioSetupPage.cs" />
  </ItemGroup>
  <ItemGroup>
    <Folder Include="$(MSBuildThisFileDirectory)Entity\Device\" />
HDL_ON/UI/MainPage.cs
@@ -26,7 +26,7 @@
        /// <summary>
        /// 版本号
        /// </summary>
        public static string VersionString = "1.8.1";
        public static string VersionString = "1.8.0";
        ///// <summary>
        ///// 客户端类型
        ///// </summary>
HDL_ON/UI/UI2/FuntionControlView/VideoDoorLock/CommonMethod.cs
@@ -323,9 +323,15 @@
            this.MainThread(() =>
            {
                if (string.IsNullOrEmpty(jpushMessageInfo.expantContent)) return;
                try
                {
                //{ "deviceSid":"J92513662","type":"opendoormsg","extDevId":"J92513662","deviceId":"1641010144999936001","spk":"security.door.ezviz"}
                var expantContent = Newtonsoft.Json.JsonConvert.DeserializeObject<ExpantContent>(jpushMessageInfo.expantContent);
                if (expantContent == null)
                    {
                        return;
                    }
                    if (expantContent.spk == null)
                {
                    return;
                }
@@ -348,6 +354,10 @@
                    //开门推送
                    this.UpdateDoorLockState(PushMessageType.Prompt);
                }
                }catch(Exception ex)
                {
                }
            });
        }
HDL_ON/UI/UI2/FuntionControlView/VideoDoorLock/UnlockSettingFacePage.cs
@@ -33,6 +33,7 @@
                Y = Application.GetRealHeight(64),
                Height = Application.GetRealHeight(600),
                ScrollEnabled = false,
                BackgroundColor = CSS_Color.BackgroundColor,
            };
            bodyView.AddChidren(contentView);
@@ -173,6 +174,7 @@
            var btnTriggerModeStateText = new Button()
            {
                X = Application.GetRealWidth(100),
                Width = Application.GetRealWidth(223),
                TextAlignment = TextAlignment.CenterRight,
                TextSize = CSS_FontSize.TextFontSize,
@@ -238,7 +240,10 @@
            faceEntryHelpView.AddChidren(btnFaceEntryHelpText);
            btnFaceEntryHelpText.MouseUpEventHandler = (sender, e) => {
                var page = new VideoDoorlockFaceUnlockHelpPage();
                MainPage.BasePageView.AddChidren(page);
                page.LoadPage();
                MainPage.BasePageView.PageIndex = MainPage.BasePageView.ChildrenCount - 1;
            };
            #endregion
HDL_ON/UI/UI2/FuntionControlView/VideoDoorLock/VideoDoorlockAudioSetupPage.cs
New file
@@ -0,0 +1,444 @@
using System;
using System.Collections.Generic;
using HDL_ON.Common;
using HDL_ON.DAL.Server;
using HDL_ON.Entity;
using HDL_ON.UI.CSS;
using Shared;
namespace HDL_ON.UI.UI2.FuntionControlView.VideoDoorLock
{
    public class VideoDoorlockAudioSetupPage : FrameLayout
    {
        FrameLayout bodyView;
        Function device;
        public VideoDoorlockAudioSetupPage(Function function)
        {
            device = function;
            bodyView = this;
        }
        public void LoadPage()
        {
            new TopViewDiv(bodyView, Language.StringByID(StringId.AudioSetup)).LoadTopView();
            bodyView.BackgroundColor = CSS_Color.BackgroundColor;
            #region 门锁系统音量
            var doorlockSystemVolumeView = new FrameLayout()
            {
                Y = Application.GetRealHeight(64),
                Height = Application.GetRealHeight(50),
                BackgroundColor = CSS.CSS_Color.MainBackgroundColor,
            };
            bodyView.AddChidren(doorlockSystemVolumeView);
            var btnDoorlockSystemVolumeRight = new Button()
            {
                X = Application.GetRealWidth(339),
                Gravity = Gravity.CenterVertical,
                Width = Application.GetMinRealAverage(16),
                Height = Application.GetMinRealAverage(16),
                UnSelectedImagePath = "Public/Right.png",
            };
            doorlockSystemVolumeView.AddChidren(btnDoorlockSystemVolumeRight);
            var btnDoorlockSystemVolumeStateText = new Button()
            {
                X = Application.GetRealWidth(100),
                Width = Application.GetRealWidth(223),
                TextAlignment = TextAlignment.CenterRight,
                TextSize = CSS_FontSize.TextFontSize,
                TextColor = CSS_Color.PromptingColor1,
            };
            doorlockSystemVolumeView.AddChidren(btnDoorlockSystemVolumeStateText);
            var btnDoorlockSystemVolumeText = new Button()
            {
                X = Application.GetRealWidth(16),
                TextSize = CSS_FontSize.SubheadingFontSize,
                TextColor = CSS_Color.FirstLevelTitleColor,
                TextAlignment = TextAlignment.CenterLeft,
                TextID = StringId.DoorlockSystemVolume,
            };
            doorlockSystemVolumeView.AddChidren(btnDoorlockSystemVolumeText);
            btnDoorlockSystemVolumeText.MouseUpEventHandler = (sender, e) =>
            {
            };
            #endregion
            #region 门铃音量
            var viewDoorbellVolume = new FrameLayout()
            {
                Y = doorlockSystemVolumeView.Bottom,
                Height = Application.GetRealHeight(50),
                BackgroundColor = CSS.CSS_Color.MainBackgroundColor,
            };
            bodyView.AddChidren(viewDoorbellVolume);
            viewDoorbellVolume.AddChidren(new Button
            {
                Height = 1,
                BackgroundColor = CSS_Color.DividingLineColor,
            });
            var btnDoorbellVolumeRight = new Button()
            {
                X = Application.GetRealWidth(339),
                Gravity = Gravity.CenterVertical,
                Width = Application.GetMinRealAverage(16),
                Height = Application.GetMinRealAverage(16),
                UnSelectedImagePath = "Public/Right.png",
            };
            viewDoorbellVolume.AddChidren(btnDoorbellVolumeRight);
            var btnDoorbellVolumeStateText = new Button()
            {
                X = Application.GetRealWidth(100),
                Width = Application.GetRealWidth(223),
                TextAlignment = TextAlignment.CenterRight,
                TextSize = CSS_FontSize.TextFontSize,
                TextColor = CSS_Color.PromptingColor1,
            };
            viewDoorbellVolume.AddChidren(btnDoorbellVolumeStateText);
            var btnDoorbellVolumeText = new Button()
            {
                X = Application.GetRealWidth(16),
                TextSize = CSS_FontSize.SubheadingFontSize,
                TextColor = CSS_Color.FirstLevelTitleColor,
                TextAlignment = TextAlignment.CenterLeft,
                TextID = StringId.DoorbellVolume,
            };
            viewDoorbellVolume.AddChidren(btnDoorbellVolumeText);
            btnDoorbellVolumeText.MouseUpEventHandler = (sender, e) =>
            {
            };
            #endregion
            var waitPage = new Loading();
            bodyView.AddChidren(waitPage);
            waitPage.Start("");
            new System.Threading.Thread(() => {
                try
                {
                    var pack = ApiUtlis.Ins.HttpRequest.GetDoorLockSystemSound(device.deviceId);
                    if (pack != null && pack.Code == StateCode.SUCCESS)
                    {
                        Application.RunOnMainThread(() =>
                        {
                            //更新界面
                            var doorLockSystemSound = Newtonsoft.Json.JsonConvert.DeserializeObject<DoorLockSystemSound>(pack.Data.ToString());
                            if(doorLockSystemSound != null)
                            {
                                switch (doorLockSystemSound.sound)
                                {
                                    case 0:
                                        btnDoorlockSystemVolumeStateText.TextID = StringId.Mute;
                                        break;
                                    case 1:
                                        btnDoorlockSystemVolumeStateText.TextID = StringId.Low;
                                        break;
                                    case 2:
                                        btnDoorlockSystemVolumeStateText.TextID = StringId.Moderate;
                                        break;
                                    case 3:
                                        btnDoorlockSystemVolumeStateText.TextID = StringId.High;
                                        break;
                                }
                            }
                        });
                    }
                    else
                    {
                        //失败提示
                        Application.RunOnMainThread(() =>
                        {
                            if (!string.IsNullOrEmpty(pack.message))
                            {
                                var tip = new Tip()
                                {
                                    MaxWidth = Application.GetRealWidth(300),
                                    Text = $"{pack.message}({pack.Code})",
                                    CloseTime = 3,
                                    Direction = AMPopTipDirection.None
                                };
                                tip.Show(MainPage.BaseView);
                            }
                        });
                    }
                    pack = ApiUtlis.Ins.HttpRequest.GetDoorBellTone(device.deviceId);
                    if (pack != null && pack.Code == StateCode.SUCCESS)
                    {
                        Application.RunOnMainThread(() =>
                        {
                            //更新界面
                            var doorbellTone = Newtonsoft.Json.JsonConvert.DeserializeObject<DoorBellTone>(pack.Data.ToString());
                            if (doorbellTone != null)
                            {
                                if (doorbellTone.volume == 0)
                                {
                                    btnDoorbellVolumeStateText.TextID = StringId.Mute;
                                }
                                else if (doorbellTone.volume > 0 && doorbellTone.volume < 35)
                                {
                                    btnDoorbellVolumeStateText.TextID = StringId.Low;
                                }
                                else if (doorbellTone.volume > 35 && doorbellTone.volume < 70)
                                {
                                    btnDoorbellVolumeStateText.TextID = StringId.Moderate;
                                }
                                else if (doorbellTone.volume > 70)
                                {
                                    btnDoorbellVolumeStateText.TextID = StringId.High;
                                }
                            }
                        });
                    }
                    else
                    {
                        //失败提示
                        Application.RunOnMainThread(() =>
                        {
                            if (!string.IsNullOrEmpty(pack.message))
                            {
                                var tip = new Tip()
                                {
                                    MaxWidth = Application.GetRealWidth(300),
                                    Text = $"{pack.message}({pack.Code})",
                                    CloseTime = 3,
                                    Direction = AMPopTipDirection.None
                                };
                                tip.Show(MainPage.BaseView);
                            }
                        });
                    }
                }
                catch (Exception ex)
                {
                    MainPage.Log($"UnlockSettingPage error : {ex.Message}");
                }
                finally
                {
                    Application.RunOnMainThread(() =>
                    {
                        waitPage.Hide();
                    });
                }
            })
            { IsBackground = true }.Start();
        }
        /// <summary>
        /// 加载功能属性数据选择弹窗
        /// </summary>
        void LoadEditDialog_FunctionPar(int titleId, int index, Button btn)
        {
            Button lastButton = new Button();
            var lastData = "";
            var lastText = "";
            Dialog dialog = new Dialog();
            var pView = new FrameLayout()
            {
                BackgroundColor = CSS_Color.DialogTransparentColor1,
            };
            dialog.AddChidren(pView);
            var optionBaseView = new FrameLayout()
            {
                Y = Application.GetRealHeight(579 - 50 * 4),
                Gravity = Gravity.CenterHorizontal,
                Width = Application.GetRealWidth(343),
                Height = Application.GetRealHeight(50 * 4 + 50),
                AnimateSpeed = 0.3f,
                Animate = Animate.DownToUp,
                BackgroundColor = CSS_Color.MainBackgroundColor,
                Radius = (uint)Application.GetRealWidth(12),
            };
            pView.AddChidren(optionBaseView);
            var topView = new FrameLayout()
            {
                Gravity = Gravity.CenterHorizontal,
                Width = Application.GetRealWidth(343),
                Height = Application.GetRealHeight(50),
                BackgroundColor = CSS_Color.MainBackgroundColor,
                Radius = (uint)Application.GetRealWidth(12),
            };
            optionBaseView.AddChidren(topView);
            var btnTitle = new Button()
            {
                Gravity = Gravity.CenterHorizontal,
                TextAlignment = TextAlignment.Center,
                Width = Application.GetRealWidth(100),
                TextID = titleId,
                IsBold = true,
                TextColor = CSS_Color.FirstLevelTitleColor,
                TextSize = CSS_FontSize.SubheadingFontSize,
            };
            topView.AddChidren(btnTitle);
            var btnCancel = new Button()
            {
                X = Application.GetRealWidth(21),
                Width = Application.GetRealWidth(100),
                TextAlignment = TextAlignment.CenterLeft,
                TextColor = CSS_Color.PromptingColor1,
                TextSize = CSS_FontSize.TextFontSize,
                TextID = StringId.Cancel,
            };
            topView.AddChidren(btnCancel);
            var btnConfrim = new Button()
            {
                Width = Application.GetRealWidth(320),
                TextAlignment = TextAlignment.CenterRight,
                TextColor = CSS_Color.MainColor,
                TextSize = CSS_FontSize.TextFontSize,
                TextID = StringId.Complete,
            };
            topView.AddChidren(btnConfrim);
            int hei = 1;
            var statusList = new List<string>
            {
                Language.StringByID(StringId.High),
                Language.StringByID(StringId.Moderate),
                Language.StringByID(StringId.Low),
                Language.StringByID(StringId.Mute),
            };
            foreach (var m in statusList)
            {
                var row = new FrameLayout()
                {
                    Y = Application.GetRealHeight(50 * hei),
                    Height = Application.GetRealHeight(50),
                };
                optionBaseView.AddChidren(row);
                if (statusList.Count > hei)
                {
                    optionBaseView.AddChidren(new Button()
                    {
                        Gravity = Gravity.CenterHorizontal,
                        Y = row.Bottom,
                        Width = Application.GetRealWidth(343),
                        BackgroundColor = CSS_Color.DividingLineColor,
                        Height = 1,
                    });
                }
                hei++;
                var btnChoose = new Button()
                {
                    X = Application.GetRealWidth(303),
                    Gravity = Gravity.CenterVertical,
                    Width = Application.GetMinRealAverage(28),
                    Height = Application.GetMinRealAverage(28),
                    UnSelectedImagePath = "Public/ChooseIcon.png",
                    SelectedImagePath = "Public/ChooseOnIcon.png",
                };
                row.AddChidren(btnChoose);
                if (index == hei - 1)
                {
                    lastButton = btnChoose;
                    btnChoose.IsSelected = true;
                }
                var btnPropertyTitle = new Button()
                {
                    X = Application.GetRealWidth(16),
                    TextAlignment = TextAlignment.CenterLeft,
                    TextColor = CSS_Color.FirstLevelTitleColor,
                    TextSize = CSS_FontSize.TextFontSize,
                    Tag = index,
                    Text = m
                };
                row.AddChidren(btnPropertyTitle);
                btnPropertyTitle.MouseUpEventHandler = (sender, e) => {
                    btnChoose.IsSelected = true;
                    if (lastButton != null)
                    {
                        lastButton.IsSelected = false;
                    }
                    lastButton = btnChoose;
                    lastData = btnPropertyTitle.Tag.ToString();
                    lastText = btnPropertyTitle.Text;
                };
            }
            dialog.Show();
            pView.MouseUpEventHandler = (sender, e) => {
                dialog.Close();
            };
            btnCancel.MouseUpEventHandler = (sender, e) => {
                dialog.Close();
            };
            btnConfrim.MouseUpEventHandler = (sender, e) => {
                dialog.Close();
                trait.value = lastData;
                //sceneFunction.status.Find((obj) => obj.key == FunctionAttributeKey.OnOff).value = trait.curValue.ToString() ;
                btn.Text = lastText;
            };
        }
    }
    /// <summary>
    /// 门锁系统声音
    /// </summary>
    public class DoorLockSystemSound
    {
        /// <summary>
        /// 声音
        /// 0-静音 1-低音 2-中音 3-高音 4-自动
        /// </summary>
        public int sound = 0;
    }
    /// <summary>
    /// 门铃提示音量
    /// </summary>
    public class DoorBellTone
    {
        /// <summary>
        /// 音量 范围0-100
        /// </summary>
        public int volume = 0;
    }
}
HDL_ON/UI/UI2/FuntionControlView/VideoDoorLock/VideoDoorlockFaceUnlockHelpPage.cs
New file
@@ -0,0 +1,160 @@
using System;
using HDL_ON.UI.CSS;
using Shared;
namespace HDL_ON.UI.UI2.FuntionControlView.VideoDoorLock
{
    public class VideoDoorlockFaceUnlockHelpPage : FrameLayout
    {
        FrameLayout bodyView;
        public VideoDoorlockFaceUnlockHelpPage()
        {
            bodyView = this;
        }
        public void LoadPage()
        {
            new TopViewDiv(bodyView, Language.StringByID(StringId.TriggerMode)).LoadTopView();
            bodyView.BackgroundColor = CSS_Color.MainBackgroundColor;
            var contentView = new VerticalScrolViewLayout()
            {
                Y = Application.GetRealHeight(64),
                Height = Application.GetRealHeight(667 - 64),
            };
            bodyView.AddChidren(contentView);
            //DoorlockHelpImage
            var btnImage1 = new Button()
            {
                Height = Application.GetRealWidth(180),
                UnSelectedImagePath = "FunctionIcon/DoorLock/DoorlockHelpImage1.png"
            };
            contentView.AddChidren(btnImage1);
            var msgView1 = new FrameLayout()
            {
                Height = Application.GetRealHeight(253),
            };
            contentView.AddChidren(msgView1);
            var btnMsg1Title = new Button()
            {
                X = Application.GetRealWidth(16),
                Y = Application.GetRealHeight(20),
                Width = Application.GetRealWidth(343),
                Height = Application.GetRealHeight(49),
                TextAlignment = TextAlignment.CenterLeft,
                TextSize = CSS_FontSize.SubheadingFontSize,
                TextColor = CSS_Color.FirstLevelTitleColor,
                Text = "录入前"
            };
            msgView1.AddChidren(btnMsg1Title);
            var btnMsg1Tip = new Button()
            {
                X = Application.GetRealWidth(16),
                Y = btnMsg1Title.Bottom,
                Width = Application.GetRealWidth(343),
                Height = Application.GetRealHeight(184),
                TextAlignment = TextAlignment.CenterLeft,
                IsMoreLines = true,
                TextSize = CSS_FontSize.TextFontSize,
                TextColor = CSS_Color.FirstLevelTitleColor,
                Text = "请到门锁旁,按门锁set键,使用主用户登录菜单,选择“添加用户-添加人脸”/“用户管理-用户编号-添加人脸”。以下是几个需要注意的点:\r\n" +
                        "\r\n1、为了保证录入效果,请在关门的情况下录入人脸(关门前请确保有其他开门方式可进门)。\r\n" +
                        "\r\n2、录入时请露出清晰的面部特征,不要佩戴帽子、口罩。\r\n"
            };
            msgView1.AddChidren(btnMsg1Tip);
            var btnImage2 = new Button()
            {
                Height = Application.GetRealWidth(132),
                UnSelectedImagePath = "FunctionIcon/DoorLock/DoorlockHelpImage2.png"
            };
            contentView.AddChidren(btnImage2);
            var msgView2 = new FrameLayout()
            {
                Height = Application.GetRealHeight(129),
            };
            contentView.AddChidren(msgView2);
            var btnMsg2Title = new Button()
            {
                X = Application.GetRealWidth(16),
                Y = Application.GetRealHeight(20),
                Width = Application.GetRealWidth(343),
                Height = Application.GetRealHeight(49),
                TextAlignment = TextAlignment.CenterLeft,
                TextSize = CSS_FontSize.SubheadingFontSize,
                TextColor = CSS_Color.FirstLevelTitleColor,
                Text = "录入中"
            };
            msgView2.AddChidren(btnMsg2Title);
            var btnMsg2Tip = new Button()
            {
                X = Application.GetRealWidth(16),
                Y = btnMsg1Title.Bottom,
                Width = Application.GetRealWidth(343),
                Height = Application.GetRealHeight(60),
                TextAlignment = TextAlignment.CenterLeft,
                IsMoreLines = true,
                TextSize = CSS_FontSize.TextFontSize,
                TextColor = CSS_Color.FirstLevelTitleColor,
                Text = "1、请站在锁正前方,并与锁具保持一臂距离(50cm左右)进行采集。\r\n",
            };
            msgView2.AddChidren(btnMsg2Tip);
            var btnImage3 = new Button()
            {
                Height = Application.GetRealWidth(180),
                UnSelectedImagePath = "FunctionIcon/DoorLock/DoorlockHelpImage3.png"
            };
            contentView.AddChidren(btnImage3);
            var btnMsg3 = new Button()
            {
                X = Application.GetRealWidth(16),
                Width = Application.GetRealWidth(343),
                Height = Application.GetRealHeight(104),
                TextAlignment = TextAlignment.CenterLeft,
                IsMoreLines = true,
                TextSize = CSS_FontSize.TextFontSize,
                TextColor = CSS_Color.FirstLevelTitleColor,
                Text = "2、录入时请跟随语音指导微微转动头部,以竖直或水平线为轴,转动幅度请控制在30度以内。\r\n"
            };
            contentView.AddChidren(btnMsg3);
            var btnImage4 = new Button()
            {
                Height = Application.GetRealWidth(204),
                UnSelectedImagePath = "FunctionIcon/DoorLock/DoorlockHelpImage4.png"
            };
            contentView.AddChidren(btnImage4);
            if(Language.CurrentLanguage != "Chinese")
            {
                btnMsg1Title.Text = "Before entry";
                btnMsg1Tip.Text = "Please go to the door lock, press the door lock set key, use the main user login menu, select 'Add User -Add Face'/'User Management -User ID - Add Face'. Here are a few points to note: \r\n"
                                    + "\r\n1.To ensure the recording effect, please input your face while closing the door(please ensure that there are other door opening methods available before closing the door). \r\n"
                                    + "\r\n2.Please show clear facial features when entering, and do not wear hats or masks.\r\n";
                btnMsg2Title.Text = "Entering";
                btnMsg2Tip.Text = "1. Please stand in front of the lock and maintain an arm's distance (approximately 50cm) from the lock for collection.\r\n";
                btnMsg3.Text = "2. When entering, please follow the voice guidance to slightly rotate the head, using a vertical or horizontal line as the axis, and the rotation amplitude should be controlled within 30 degrees.\r\n";
            }
        }
    }
}
HDL_ON/UI/UI2/FuntionControlView/VideoDoorLock/VideoDoorlockFaceUnlockTriggerSettingPage.cs
@@ -41,9 +41,10 @@
                Y = Application.GetRealHeight(20),
                Width = Application.GetRealWidth(164),
                Height = Application.GetRealWidth(60),
                Radius = (uint)Application.GetRealWidth(30),
                Radius = (uint)Application.GetRealWidth(12),
                BackgroundColor = faceUnlockSetup.mode == 0 ? CSS_Color.MainColor : CSS_Color.MainBackgroundColor,
                BorderColor = CSS_Color.MainColor,
                BorderWidth = 1,
            };
            contentView.AddChidren(autoView);
@@ -60,10 +61,11 @@
            var btnAutoText = new Button
            {
                X = btnAutoIcon.Right + Application.GetRealWidth(4),
                Width = Application.GetRealWidth(50),
                Width = Application.GetRealWidth(90),
                TextAlignment = TextAlignment.CenterLeft,
                TextSize = CSS_FontSize.HeadlineFontSize,
                TextColor = faceUnlockSetup.mode == 1 ? CSS_Color.MainColor : CSS_Color.MainBackgroundColor,
                TextID = StringId.AutomaticTriggering,
            };
            autoView.AddChidren(btnAutoText);
            
@@ -74,13 +76,14 @@
            #region 手动触发
            var manualView = new FrameLayout()
            {
                X = Application.GetRealWidth(16),
                X = Application.GetRealWidth(196),
                Y = Application.GetRealHeight(20),
                Width = Application.GetRealWidth(164),
                Height = Application.GetRealWidth(60),
                Radius = (uint)Application.GetRealWidth(30),
                Radius = (uint)Application.GetRealWidth(12),
                BackgroundColor = faceUnlockSetup.mode == 1 ? CSS_Color.MainColor : CSS_Color.MainBackgroundColor,
                BorderColor = CSS_Color.MainColor,
                BorderWidth = 1,
            };
            contentView.AddChidren(manualView);
@@ -97,10 +100,11 @@
            var btnManualText = new Button
            {
                X = btnManualIcon.Right + Application.GetRealWidth(4),
                Width = Application.GetRealWidth(50),
                Width = Application.GetRealWidth(90),
                TextAlignment = TextAlignment.CenterLeft,
                TextSize = CSS_FontSize.HeadlineFontSize,
                TextColor = faceUnlockSetup.mode == 0 ? CSS_Color.MainColor : CSS_Color.MainBackgroundColor,
                TextID = StringId.ManualTriggering,
            };
            manualView.AddChidren(btnManualText);
            btnManualText.MouseUpEventHandler = (sender, e) => {
@@ -134,7 +138,9 @@
                                btnAutoText.TextColor = CSS_Color.MainBackgroundColor;
                                manualView.BackgroundColor = CSS_Color.MainBackgroundColor;
                                btnManualIcon.UnSelectedImagePath = "FunctionIcon/DoorLock/ManualTriggerIcon_blue.png";
                                btnAutoText.TextColor = CSS_Color.MainColor;
                                btnManualText.TextColor = CSS_Color.MainColor;
                                automaitcTipView.Visible = true;
                                manualTipView.Visible = false;
                            });
                        }
@@ -198,7 +204,9 @@
                                btnAutoText.TextColor = CSS_Color.MainColor;
                                manualView.BackgroundColor = CSS_Color.MainColor;
                                btnManualIcon.UnSelectedImagePath = "FunctionIcon/DoorLock/ManualTriggerIcon_white.png";
                                btnAutoText.TextColor = CSS_Color.MainBackgroundColor;
                                btnManualText.TextColor = CSS_Color.MainBackgroundColor;
                                automaitcTipView.Visible = false;
                                manualTipView.Visible = true;
                            });
                        }
@@ -242,31 +250,31 @@
            if(faceUnlockSetup.mode == 0)
            {
                automaitcView.Visible = true;
                manualView.Visible = false;
                automaitcTipView.Visible = true;
                manualTipView.Visible = false;
            }
            else
            {
                automaitcView.Visible = false;
                manualView.Visible = true;
                automaitcTipView.Visible = false;
                manualTipView.Visible = true;
            }
        }
        FrameLayout automaitcView;
        FrameLayout manualView;
        FrameLayout automaitcTipView;
        FrameLayout manualTipView;
        /// <summary>
        /// 加载自动触发方式提示
        /// </summary>
        void loadAutomaitcTipView()
        {
            automaitcView = new FrameLayout()
            automaitcTipView = new FrameLayout()
            {
                Y = Application.GetRealHeight(128),
                Y = Application.GetRealHeight(128 + 64),
                Height = Application.GetRealHeight(667 - 128 - 64),
                BackgroundColor = CSS_Color.MainBackgroundColor
            };
            bodyView.AddChidren(automaitcView);
            bodyView.AddChidren(automaitcTipView);
            var btnAutomaitcImage = new Button()
            {
@@ -275,7 +283,7 @@
                Height = Application.GetRealWidth(200),
                UnSelectedImagePath = "FunctionIcon/DoorLock/FaceUnlockImage.png",
            };
            automaitcView.AddChidren(btnAutomaitcImage);
            automaitcTipView.AddChidren(btnAutomaitcImage);
            var btnAutomaitcTip = new Button()
            {
@@ -289,7 +297,7 @@
                IsMoreLines = true,
                TextID = StringId.FaceUnlockTip
            };
            automaitcView.AddChidren(btnAutomaitcTip);
            automaitcTipView.AddChidren(btnAutomaitcTip);
            var btnAutomaitcNote = new Button()
            {
@@ -301,7 +309,7 @@
                TextColor = CSS_Color.PromptingColor1,
                TextID = StringId.FaceUnlockNote,
            };
            automaitcView.AddChidren(btnAutomaitcNote);
            automaitcTipView.AddChidren(btnAutomaitcNote);
        }
        /// <summary>
@@ -309,35 +317,65 @@
        /// </summary>
        void loadManualTipView()
        {
            manualView = new FrameLayout()
            manualTipView = new FrameLayout()
            {
                Y = Application.GetRealHeight(128),
                Y = Application.GetRealHeight(128 + 64),
                Height = Application.GetRealHeight(667 - 128 - 64),
                BackgroundColor = CSS_Color.MainBackgroundColor
            };
            bodyView.AddChidren(manualView);
            bodyView.AddChidren(manualTipView);
            var btnNumber1 = new Button()
            {
                X = Application.GetRealWidth(84),
                //Y = Application.GetRealHeight()
                Width = Application.GetRealWidth(24),
                Height = Application.GetRealWidth(24),
                Radius = (uint)Application.GetRealWidth(12),
                BorderColor = CSS_Color.MainColor,
                BorderWidth = 1,
                TextSize = CSS_FontSize.SubheadingFontSize,
                TextColor = CSS_Color.MainColor,
                TextAlignment = TextAlignment.Center,
                Text = "1",
            };
            manualTipView.AddChidren(btnNumber1);
            var btnNumber2 = new Button()
            {
                X = Application.GetRealWidth(267),
                //Y = Application.GetRealHeight()
                Width = Application.GetRealWidth(24),
                Height = Application.GetRealWidth(24),
                Radius = (uint)Application.GetRealWidth(12),
                BorderColor = CSS_Color.MainColor,
                BorderWidth = 1,
                TextSize = CSS_FontSize.SubheadingFontSize,
                TextColor = CSS_Color.MainColor,
                TextAlignment = TextAlignment.Center,
                Text = "2",
            };
            manualTipView.AddChidren(btnNumber2);
            var btnImage1 = new Button()
            {
                X = Application.GetRealWidth(16),
                Y = Application.GetRealHeight(31),
                Gravity = Gravity.CenterHorizontal,
                Width = Application.GetRealWidth(160),
                Height = Application.GetRealWidth(160),
                UnSelectedImagePath = "FunctionIcon/DoorLock/TouchUnlcokImage.png",
            };
            manualView.AddChidren(btnImage1);
            manualTipView.AddChidren(btnImage1);
            var btnAutomaitcImage = new Button()
            {
                X = btnImage1.Right + Application.GetRealWidth(24),
                Y = Application.GetRealHeight(31),
                Gravity = Gravity.CenterHorizontal,
                Width = Application.GetRealWidth(160),
                Height = Application.GetRealWidth(160),
                UnSelectedImagePath = "FunctionIcon/DoorLock/FaceUnlockImage.png",
            };
            manualView.AddChidren(btnAutomaitcImage);
            manualTipView.AddChidren(btnAutomaitcImage);
            var btnManualTip = new Button()
            {
@@ -351,7 +389,7 @@
                IsMoreLines = true,
                TextID = StringId.FaceManualUnlockTip
            };
            manualView.AddChidren(btnManualTip);
            manualTipView.AddChidren(btnManualTip);
        }
    }
}