wxr
2023-03-30 8407d6631ac8f5b65c4a14fa27babaa48026d4ca
Merge branch 'wjc' into Dev-Branch
28个文件已添加
58个文件已修改
3249 ■■■■■ 已修改文件
DLL/EZvizMonitor/ys.dll 补丁 | 查看 | 原始文档 | blame | 历史
DLL/IOS/EZSDK.IOS.dll 补丁 | 查看 | 原始文档 | blame | 历史
HDL-ON_Android/Assets/Language.ini 41 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HDL-ON_Android/Assets/Phone/FunctionIcon/DoorLock/Cell.png 补丁 | 查看 | 原始文档 | blame | 历史
HDL-ON_Android/Assets/Phone/FunctionIcon/DoorLock/HistoryList.png 补丁 | 查看 | 原始文档 | blame | 历史
HDL-ON_Android/Assets/Phone/FunctionIcon/DoorLock/OneOpenLock.png 补丁 | 查看 | 原始文档 | blame | 历史
HDL-ON_Android/Assets/Phone/FunctionIcon/DoorLock/RTV.png 补丁 | 查看 | 原始文档 | blame | 历史
HDL-ON_Android/Assets/Phone/FunctionIcon/DoorLock/UnLocked.png 补丁 | 查看 | 原始文档 | blame | 历史
HDL-ON_Android/Assets/Phone/FunctionIcon/DoorLock/UnLocking.png 补丁 | 查看 | 原始文档 | blame | 历史
HDL-ON_Android/Assets/Phone/FunctionIcon/DoorLock/VideoDoorLockClose.png 补丁 | 查看 | 原始文档 | blame | 历史
HDL-ON_Android/Assets/Phone/FunctionIcon/DoorLock/VideoDoorLockOpen.png 补丁 | 查看 | 原始文档 | blame | 历史
HDL-ON_Android/Assets/Phone/FunctionIcon/DoorLock/VideoDoorlockClose.png 补丁 | 查看 | 原始文档 | blame | 历史
HDL-ON_Android/Assets/Phone/FunctionIcon/DoorLock/history.png 补丁 | 查看 | 原始文档 | blame | 历史
HDL-ON_Android/Assets/Phone/FunctionIcon/FunctionBg/VideoDoorLockFunctionBg.png 补丁 | 查看 | 原始文档 | blame | 历史
HDL-ON_Android/Assets/Phone/FunctionIcon/Icon/securitydoorezviz.png 补丁 | 查看 | 原始文档 | blame | 历史
HDL-ON_Android/HDL-ON_Android.csproj 36 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HDL-ON_Android/Other/JPush/JPushReceiver.cs 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HDL-ON_Android/Resources/drawable/btn_disagree.xml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
HDL-ON_Android/Resources/drawable/dialog_background2.xml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
HDL-ON_iOS/BlueWifi.cs 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HDL-ON_iOS/HDL-ON_iOS.csproj 34 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HDL-ON_iOS/Resources/EZ/Base.lproj/AddDevice.storyboard 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HDL-ON_iOS/Resources/EZ/Base.lproj/EZMain.storyboard 22 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HDL-ON_iOS/Resources/EZ/Base.lproj/EZVideoTalkViewcontroller.xib 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HDL-ON_iOS/Resources/Language.ini 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HDL-ON_iOS/Resources/Phone/FunctionIcon/DoorLock/Cell.png 补丁 | 查看 | 原始文档 | blame | 历史
HDL-ON_iOS/Resources/Phone/FunctionIcon/DoorLock/HistoryList.png 补丁 | 查看 | 原始文档 | blame | 历史
HDL-ON_iOS/Resources/Phone/FunctionIcon/DoorLock/OneOpenLock.png 补丁 | 查看 | 原始文档 | blame | 历史
HDL-ON_iOS/Resources/Phone/FunctionIcon/DoorLock/RTV.png 补丁 | 查看 | 原始文档 | blame | 历史
HDL-ON_iOS/Resources/Phone/FunctionIcon/DoorLock/UnLocked.png 补丁 | 查看 | 原始文档 | blame | 历史
HDL-ON_iOS/Resources/Phone/FunctionIcon/DoorLock/UnLocking.png 补丁 | 查看 | 原始文档 | blame | 历史
HDL-ON_iOS/Resources/Phone/FunctionIcon/DoorLock/VideoDoorLockClose.png 补丁 | 查看 | 原始文档 | blame | 历史
HDL-ON_iOS/Resources/Phone/FunctionIcon/DoorLock/VideoDoorLockOpen.png 补丁 | 查看 | 原始文档 | blame | 历史
HDL-ON_iOS/Resources/Phone/FunctionIcon/FunctionBg/VideoDoorLockFunctionBg.png 补丁 | 查看 | 原始文档 | blame | 历史
HDL-ON_iOS/Resources/Phone/FunctionIcon/Icon/securitydoorezviz.png 补丁 | 查看 | 原始文档 | blame | 历史
HDL-ON_iOS/Resources/en.lproj/Localizable.strings 43 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HDL-ON_iOS/Resources/zh-Hans.lproj/Localizable.strings 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HDL_APP_Project.sln 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HDL_ON/Common/ApiUtlis.cs 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HDL_ON/Common/Constant.cs 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HDL_ON/Common/HDLCommon.cs 93 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HDL_ON/Common/R.cs 58 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HDL_ON/DAL/DriverLayer/Control.cs 92 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HDL_ON/DAL/Server/HttpServerRequest.cs 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HDL_ON/DAL/Server/NewAPI.cs 46 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HDL_ON/DAL/ThirdPartySdk/ESOnVideo.cs 14 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HDL_ON/DAL/ThirdPartySdk/HDLLinphone.cs 66 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HDL_ON/Entity/DB_ResidenceData.cs 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
HDL_ON/Entity/Enumerative/MyEnum.cs 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HDL_ON/Entity/Function/Function.cs 17 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HDL_ON/Entity/FunctionList.cs 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HDL_ON/Entity/ResponseEntity/ResidenceMemberInfo.cs 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HDL_ON/Entity/Room.cs 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HDL_ON/HDL_ON.projitems 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HDL_ON/UI/UI0-Public/PublicAssmeblyBLL.cs 16 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HDL_ON/UI/UI0-Stan/Logic/HdlBluetoothAndroidLogic.cs 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HDL_ON/UI/UI2/1-HomePage/HomePage.cs 22 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HDL_ON/UI/UI2/1-HomePage/MessageCenterPage.cs 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HDL_ON/UI/UI2/2-Classification/ClassificationPage.cs 62 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HDL_ON/UI/UI2/2-Classification/FunctionControlZone.cs 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HDL_ON/UI/UI2/2-Classification/FunctionControlZoneBLL.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
HDL_ON/UI/UI2/2-Classification/FunctionPage.cs 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HDL_ON/UI/UI2/2-Classification/RoomPage.cs 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HDL_ON/UI/UI2/3-Intelligence/Automation/ConditionDeviceFunList.cs 87 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HDL_ON/UI/UI2/3-Intelligence/Automation/InpOrOutLogicMethod.cs 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HDL_ON/UI/UI2/3-Intelligence/Automation/LogicMethod.cs 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HDL_ON/UI/UI2/3-Intelligence/Automation/Send.cs 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HDL_ON/UI/UI2/3-Intelligence/Automation/TimeTpye.cs 11 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HDL_ON/UI/UI2/4-PersonalCenter/AddFunction/AddDevciePage.cs 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HDL_ON/UI/UI2/4-PersonalCenter/AddFunction/DeviceListPage.cs 40 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HDL_ON/UI/UI2/4-PersonalCenter/PersonalCenterPageBLL.cs 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HDL_ON/UI/UI2/4-PersonalCenter/PersonalDataPage.cs 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HDL_ON/UI/UI2/4-PersonalCenter/PersonalDataPageBLL.cs 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HDL_ON/UI/UI2/4-PersonalCenter/PirDevice/PirSend.cs 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HDL_ON/UI/UI2/FuntionControlView/FunctionBaseInfoSetPage.cs 63 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HDL_ON/UI/UI2/FuntionControlView/FunctionBaseInfoSetPageBLL.cs 42 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HDL_ON/UI/UI2/FuntionControlView/Music/SendMethod.cs 13 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HDL_ON/UI/UI2/FuntionControlView/Music/View/SizeClass.cs 85 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HDL_ON/UI/UI2/FuntionControlView/Video/View/ShowDialog.cs 173 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HDL_ON/UI/UI2/FuntionControlView/VideoDoorLock/CommonMethod.cs 588 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HDL_ON/UI/UI2/FuntionControlView/VideoDoorLock/ObjectClass.cs 104 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HDL_ON/UI/UI2/FuntionControlView/VideoDoorLock/StackTraceLog.cs 58 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HDL_ON/UI/UI2/FuntionControlView/VideoDoorLock/VideDoorLockSend.cs 237 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HDL_ON/UI/UI2/FuntionControlView/VideoDoorLock/VideoDoorLockListPage.cs 222 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HDL_ON/UI/UI2/FuntionControlView/VideoDoorLock/VideoDoorLockPage.cs 540 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HDL_ON/UI/UI2/UserPage.cs 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DLL/EZvizMonitor/ys.dll
Binary files differ
DLL/IOS/EZSDK.IOS.dll
Binary files differ
HDL-ON_Android/Assets/Language.ini
@@ -1127,7 +1127,7 @@
7155=Distress/Normal
7156=Distress
7157=whether to unlock
7158=is
7158=Is
7159=Fall in the alarm
7160=Someone called the police
7161=Warning tone
@@ -1135,9 +1135,24 @@
7163=Video call
7164=Manipulator
7165=Area intrusion alarm
7166=camera
7167=main switch
7166=Camera
7167=Main switch
7168=PM10
8501=Video door lock
8502=Electric quantity
8503=The door is now closed
8504=The door is not closed
8505=RVC
8506=One click to open the lock
8507=Temporary password
8508=History
8509=Fluorite video door lock
8510=Call from the doorbell
8511=User Education
@@ -2381,6 +2396,26 @@
7168=PM10
8501=视频门锁
8502=电量
8503=当前门已关
8504=当前门未关
8505=实时视频
8506=一键开锁
8507=临时密码
8508=历史记录
8509=萤石视频门锁
8510=来自“门铃”呼叫
8511=用户人员
 
9000=请使用新的手机账号登录APP
HDL-ON_Android/Assets/Phone/FunctionIcon/DoorLock/Cell.png
HDL-ON_Android/Assets/Phone/FunctionIcon/DoorLock/HistoryList.png
HDL-ON_Android/Assets/Phone/FunctionIcon/DoorLock/OneOpenLock.png
HDL-ON_Android/Assets/Phone/FunctionIcon/DoorLock/RTV.png
HDL-ON_Android/Assets/Phone/FunctionIcon/DoorLock/UnLocked.png
HDL-ON_Android/Assets/Phone/FunctionIcon/DoorLock/UnLocking.png
HDL-ON_Android/Assets/Phone/FunctionIcon/DoorLock/VideoDoorLockClose.png
HDL-ON_Android/Assets/Phone/FunctionIcon/DoorLock/VideoDoorLockOpen.png
HDL-ON_Android/Assets/Phone/FunctionIcon/DoorLock/VideoDoorlockClose.png
HDL-ON_Android/Assets/Phone/FunctionIcon/DoorLock/history.png
HDL-ON_Android/Assets/Phone/FunctionIcon/FunctionBg/VideoDoorLockFunctionBg.png
HDL-ON_Android/Assets/Phone/FunctionIcon/Icon/securitydoorezviz.png
HDL-ON_Android/HDL-ON_Android.csproj
@@ -163,15 +163,6 @@
    <Reference Include="videophone">
      <HintPath>..\DLL\FL\Android\videophone.dll</HintPath>
    </Reference>
    <Reference Include="Square.OkHttp3">
      <HintPath>..\DLL\EZvizMonitor\Square.OkHttp3.dll</HintPath>
    </Reference>
    <Reference Include="Square.OkIO">
      <HintPath>..\DLL\EZvizMonitor\Square.OkIO.dll</HintPath>
    </Reference>
    <Reference Include="ys">
      <HintPath>..\DLL\EZvizMonitor\ys.dll</HintPath>
    </Reference>
    <Reference Include="UMSdkDroid">
      <HintPath>..\DLL\UMeng\UMSdkDroid.dll</HintPath>
    </Reference>
@@ -421,6 +412,16 @@
    <AndroidAsset Include="Assets\h5\static\font\SourceHanSansCN-Normal.otf" />
    <AndroidAsset Include="Assets\Phone\MusicIcon\currentPlayList.png" />
    <AndroidAsset Include="Assets\Phone\PersonalCenter\CombinedDimmingIcon.png" />
    <AndroidAsset Include="Assets\Phone\FunctionIcon\DoorLock\OneOpenLock.png" />
    <AndroidAsset Include="Assets\Phone\FunctionIcon\DoorLock\RTV.png" />
    <AndroidAsset Include="Assets\Phone\FunctionIcon\DoorLock\UnLocked.png" />
    <AndroidAsset Include="Assets\Phone\FunctionIcon\DoorLock\UnLocking.png" />
    <AndroidAsset Include="Assets\Phone\FunctionIcon\DoorLock\VideoDoorlockClose.png" />
    <AndroidAsset Include="Assets\Phone\FunctionIcon\DoorLock\VideoDoorLockOpen.png" />
    <AndroidAsset Include="Assets\Phone\FunctionIcon\DoorLock\History.png" />
    <AndroidAsset Include="Assets\Phone\FunctionIcon\DoorLock\Cell.png" />
    <AndroidAsset Include="Assets\Phone\FunctionIcon\FunctionBg\VideoDoorLockFunctionBg.png" />
    <AndroidAsset Include="Assets\Phone\FunctionIcon\Icon\securitydoorezviz.png" />
  </ItemGroup>
  <ItemGroup>
    <AndroidResource Include="Resources\values\colors.xml" />
@@ -769,14 +770,17 @@
    <PackageReference Include="Xamarin.Android.Support.Constraint.Layout.Solver">
      <Version>1.1.0</Version>
    </PackageReference>
    <PackageReference Include="Microsoft.AppCenter">
      <Version>4.2.0</Version>
    </PackageReference>
    <PackageReference Include="Microsoft.AppCenter.Crashes">
      <Version>4.2.0</Version>
    </PackageReference>
    <PackageReference Include="Microsoft.AppCenter.Analytics">
      <Version>4.2.0</Version>
    </PackageReference>
    <PackageReference Include="Microsoft.AppCenter">
      <Version>4.2.0</Version>
    </PackageReference>
    <PackageReference Include="Square.OkHttp3">
      <Version>3.14.4</Version>
    </PackageReference>
  </ItemGroup>
  <ItemGroup>
@@ -1618,7 +1622,7 @@
    <AndroidAsset Include="Assets\Phone\FunctionIcon\DoorLock\NormallyOpenIcon3.png" />
  </ItemGroup>
  <ItemGroup>
    <AndroidAsset Include="Assets\Phone\FunctionIcon\DoorLock\History.png" />
    <AndroidAsset Include="Assets\Phone\FunctionIcon\DoorLock\HistoryList.png" />
  </ItemGroup>
  <ItemGroup>
    <AndroidAsset Include="Assets\Phone\FunctionIcon\DoorLock\DoorLock.png" />
@@ -1632,6 +1636,12 @@
    <Folder Include="Assets\Phone\FunctionIcon\Inverter\" />
    <Folder Include="Assets\Phone\FunctionIcon\Electrical\MechanicalArm\" />
  </ItemGroup>
  <ItemGroup>
    <ProjectReference Include="..\..\ys\ys.csproj">
      <Project>{DF065E3F-C3A1-4908-9582-000974B7C290}</Project>
      <Name>ys</Name>
    </ProjectReference>
  </ItemGroup>
  <Import Project="..\HDL_ON\HDL_ON.projitems" Label="Shared" Condition="Exists('..\HDL_ON\HDL_ON.projitems')" />
  <Import Project="$(MSBuildExtensionsPath)\Xamarin\Android\Xamarin.Android.CSharp.targets" />
  <!-- To modify your build process, add your task inside one of the targets below and uncomment it.
HDL-ON_Android/Other/JPush/JPushReceiver.cs
@@ -36,7 +36,6 @@
        {
            //2020-12-23 解决点击通知栏打开不了APP问题
            //base.OnNotifyMessageOpened(context, notificationMessage);
            OpenNotification(context, notificationMessage);
        }
@@ -48,7 +47,7 @@
        public override void OnNotifyMessageArrived(Context context, NotificationMessage notificationMessage)
        {
            base.OnNotifyMessageArrived(context, notificationMessage);
            var pushMes = new JPushMessageInfo()
            {
                Title = notificationMessage.NotificationTitle,
HDL-ON_Android/Resources/drawable/btn_disagree.xml
@@ -8,7 +8,7 @@
    <!-- 填充颜色 -->
    <solid
        android:color="@color/white"        />
        android:color="#FFFFFF"/>
    <!--    边框颜色-->
    <stroke
HDL-ON_Android/Resources/drawable/dialog_background2.xml
@@ -8,6 +8,6 @@
    <!-- 填充颜色 -->
    <solid
        android:color="@color/white"        />
        android:color="#FFFFFF"/>
</shape>
HDL-ON_iOS/BlueWifi.cs
@@ -30,13 +30,14 @@
        //public string GetPer()
        //{
        //share.
        //}
        //}1
        /// <summary>
        /// 搜索到蓝牙设备之后到代理事件
        /// </summary>
        FBYBleDeviceBackBlock getBlufiDeviceDelegate;
        /// <summary>
        /// 设备搜索到蓝牙设备之后到代理事件
        /// </summary>
HDL-ON_iOS/HDL-ON_iOS.csproj
@@ -26,7 +26,7 @@
        <MtouchLink>Full</MtouchLink>
        <MtouchDebug>true</MtouchDebug>
        <CodesignKey>iPhone Developer</CodesignKey>
        <MtouchExtraArgs>-gcc_flags="-dead_strip -ObjC";-w</MtouchExtraArgs>
        <MtouchExtraArgs>-gcc_flags="-dead_strip -ObjC"</MtouchExtraArgs>
        <CodesignProvision>On+Dev-20210616-1</CodesignProvision>
        <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
    </PropertyGroup>
@@ -93,29 +93,29 @@
        <Reference Include="Shared.IOS.HDLSceneSiri">
          <HintPath>..\DLL\IOS\Shared.IOS.HDLSceneSiri.dll</HintPath>
        </Reference>
        <Reference Include="Shared.IOS.HDLLinphoneSDK">
          <HintPath>..\DLL\Linphone\iOS\Shared.IOS.HDLLinphoneSDK.dll</HintPath>
        </Reference>
        <Reference Include="HDL.Shared.IOS.ScanQRCode">
          <HintPath>..\DLL\IOS\HDL.Shared.IOS.ScanQRCode.dll</HintPath>
        </Reference>
        <Reference Include="Shared.IOS">
          <HintPath>..\DLL\Shared.IOS.dll</HintPath>
        </Reference>
        <Reference Include="Shared.IOS.HDLFVSDK">
          <HintPath>..\DLL\IOS\Shared.IOS.HDLFVSDK.dll</HintPath>
        <Reference Include="Shared.IOS.HDLLinphoneSDK">
          <HintPath>..\DLL\Linphone\iOS\Shared.IOS.HDLLinphoneSDK.dll</HintPath>
        </Reference>
        <Reference Include="Shared.IOS.ESVideoOnSDK">
          <HintPath>..\DLL\FL\iOS\Shared.IOS.ESVideoOnSDK.dll</HintPath>
        </Reference>
        <Reference Include="EZSDK.IOS">
          <HintPath>..\DLL\IOS\EZSDK.IOS.dll</HintPath>
        <Reference Include="Shared.IOS.LCVideoOnSDK">
          <HintPath>..\DLL\LC\IOS\Shared.IOS.LCVideoOnSDK.dll</HintPath>
        </Reference>
        <Reference Include="Shared.IOS.HDLCNVRSDK">
          <HintPath>..\DLL\IOS\Shared.IOS.HDLCNVRSDK.dll</HintPath>
        </Reference>
        <Reference Include="Shared.IOS.LCVideoOnSDK">
          <HintPath>..\DLL\LC\IOS\Shared.IOS.LCVideoOnSDK.dll</HintPath>
        <Reference Include="Shared.IOS.ESVideoOnSDK">
          <HintPath>..\DLL\FL\iOS\Shared.IOS.ESVideoOnSDK.dll</HintPath>
        </Reference>
        <Reference Include="Shared.IOS.HDLFVSDK">
          <HintPath>..\DLL\IOS\Shared.IOS.HDLFVSDK.dll</HintPath>
        </Reference>
        <Reference Include="EZSDK.IOS">
          <HintPath>..\DLL\IOS\EZSDK.IOS.dll</HintPath>
        </Reference>
    </ItemGroup>
    <ItemGroup>
@@ -1597,10 +1597,6 @@
      <ImageAsset Include="Assets.xcassets\AppIcon.appiconset\1024.png" />
    </ItemGroup>
    <ItemGroup>
      <ProjectReference Include="..\HdlBluWi\Blufi.csproj">
        <Project>{2DDF4C3C-6998-432E-9F43-6786D82F0630}</Project>
        <Name>Blufi</Name>
      </ProjectReference>
      <ProjectReference Include="..\SiriIntents\SiriIntents.csproj">
        <IsAppExtension>true</IsAppExtension>
        <Project>{760980F5-1CD3-4F4F-9134-34D87BECD790}</Project>
@@ -1615,6 +1611,10 @@
        <Project>{8B1652FA-5158-4D57-B90D-07BB91766625}</Project>
        <Name>SiriKit</Name>
      </ProjectReference>
      <ProjectReference Include="..\HdlBluWi\Blufi.csproj">
        <Project>{2DDF4C3C-6998-432E-9F43-6786D82F0630}</Project>
        <Name>Blufi</Name>
      </ProjectReference>
    </ItemGroup>
    <ItemGroup>
      <Content Include="Base.lproj\Intents.intentdefinition" />
HDL-ON_iOS/Resources/EZ/Base.lproj/AddDevice.storyboard
@@ -1,8 +1,9 @@
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="19162" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" colorMatched="YES" initialViewController="1Qq-y9-5Vr">
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="20037" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" colorMatched="YES" initialViewController="1Qq-y9-5Vr">
    <device id="retina4_7" orientation="portrait" appearance="light"/>
    <dependencies>
        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="19144"/>
        <deployment identifier="iOS"/>
        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="20020"/>
        <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
    </dependencies>
    <scenes>
@@ -984,8 +985,8 @@
    </scenes>
    <inferredMetricsTieBreakers>
        <segue reference="9TP-S2-hhI"/>
        <segue reference="9Lc-Kx-oZS"/>
        <segue reference="ikM-Zn-H8f"/>
        <segue reference="Lmt-j9-vhw"/>
        <segue reference="VYk-37-nb6"/>
    </inferredMetricsTieBreakers>
    <resources>
        <image name="addDevice_success" width="320" height="185"/>
HDL-ON_iOS/Resources/EZ/Base.lproj/EZMain.storyboard
@@ -1,9 +1,9 @@
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="17506" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" colorMatched="YES" initialViewController="tPl-Go-Tmu">
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="20037" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" colorMatched="YES" initialViewController="tPl-Go-Tmu">
    <device id="retina4_7" orientation="portrait" appearance="light"/>
    <dependencies>
        <deployment version="4352" identifier="iOS"/>
        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="17505"/>
        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="20020"/>
        <capability name="System colors in document resources" minToolsVersion="11.0"/>
        <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
    </dependencies>
@@ -35,7 +35,7 @@
                        <color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
                        <prototypes>
                            <tableViewCell clipsSubviews="YES" contentMode="scaleToFill" selectionStyle="default" indentationWidth="10" id="R2t-zM-WMl">
                                <rect key="frame" x="0.0" y="28" width="375" height="44"/>
                                <rect key="frame" x="0.0" y="44.5" width="375" height="44"/>
                                <autoresizingMask key="autoresizingMask"/>
                                <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="R2t-zM-WMl" id="a02-NK-SeS">
                                    <rect key="frame" x="0.0" y="0.0" width="375" height="44"/>
@@ -222,7 +222,7 @@
                        <color key="backgroundColor" red="0.94117647059999998" green="0.94117647059999998" blue="0.94509803920000002" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
                        <prototypes>
                            <tableViewCell clipsSubviews="YES" contentMode="scaleToFill" selectionStyle="default" indentationWidth="10" reuseIdentifier="EZDeviceCell" rowHeight="73" id="Xkg-Dw-w2X" customClass="DeviceListCell">
                                <rect key="frame" x="0.0" y="28" width="375" height="73"/>
                                <rect key="frame" x="0.0" y="44.5" width="375" height="73"/>
                                <autoresizingMask key="autoresizingMask"/>
                                <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="Xkg-Dw-w2X" id="Iet-JC-0rQ">
                                    <rect key="frame" x="0.0" y="0.0" width="375" height="73"/>
@@ -356,7 +356,7 @@
                    </tableView>
                    <navigationItem key="navigationItem" id="QiI-QE-qqY">
                        <rightBarButtonItems>
                            <barButtonItem systemItem="add" id="yGh-cj-oPZ">
                            <barButtonItem id="yGh-cj-oPZ">
                                <connections>
                                    <action selector="go2AddDevice:" destination="PUV-T9-WXJ" id="D58-zZ-Ox4"/>
                                </connections>
@@ -392,7 +392,7 @@
                        <color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
                        <prototypes>
                            <tableViewCell clipsSubviews="YES" contentMode="scaleToFill" selectionStyle="default" indentationWidth="10" reuseIdentifier="EZCameraCell" id="7Im-ni-l3z">
                                <rect key="frame" x="0.0" y="28" width="375" height="44"/>
                                <rect key="frame" x="0.0" y="44.5" width="375" height="44"/>
                                <autoresizingMask key="autoresizingMask"/>
                                <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="7Im-ni-l3z" id="DdN-J1-0fa">
                                    <rect key="frame" x="0.0" y="0.0" width="375" height="44"/>
@@ -512,7 +512,7 @@
                        <color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
                        <prototypes>
                            <tableViewCell clipsSubviews="YES" contentMode="scaleToFill" selectionStyle="default" indentationWidth="10" reuseIdentifier="DemoAPICell" id="wpS-t4-02o">
                                <rect key="frame" x="0.0" y="28" width="375" height="44"/>
                                <rect key="frame" x="0.0" y="44.5" width="375" height="44"/>
                                <autoresizingMask key="autoresizingMask"/>
                                <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="wpS-t4-02o" id="8mM-ux-z21">
                                    <rect key="frame" x="0.0" y="0.0" width="375" height="44"/>
@@ -551,7 +551,7 @@
                        <color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
                        <prototypes>
                            <tableViewCell clipsSubviews="YES" contentMode="scaleToFill" selectionStyle="default" indentationWidth="10" id="UVM-wN-ME4">
                                <rect key="frame" x="0.0" y="28" width="375" height="44"/>
                                <rect key="frame" x="0.0" y="44.5" width="375" height="44"/>
                                <autoresizingMask key="autoresizingMask"/>
                                <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="UVM-wN-ME4" id="PFk-ak-8nJ">
                                    <rect key="frame" x="0.0" y="0.0" width="375" height="44"/>
@@ -648,7 +648,7 @@
                        <color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
                        <prototypes>
                            <tableViewCell clipsSubviews="YES" contentMode="scaleToFill" selectionStyle="default" indentationWidth="10" id="VhH-MZ-U0P">
                                <rect key="frame" x="0.0" y="28" width="375" height="44"/>
                                <rect key="frame" x="0.0" y="44.5" width="375" height="44"/>
                                <autoresizingMask key="autoresizingMask"/>
                                <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="VhH-MZ-U0P" id="Kep-2I-4hb">
                                    <rect key="frame" x="0.0" y="0.0" width="375" height="44"/>
@@ -1809,7 +1809,7 @@
                        <color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
                        <prototypes>
                            <tableViewCell clipsSubviews="YES" contentMode="scaleToFill" selectionStyle="default" indentationWidth="10" reuseIdentifier="MessageCell" rowHeight="75" id="St6-kz-bZE" customClass="MessageListCell">
                                <rect key="frame" x="0.0" y="28" width="375" height="75"/>
                                <rect key="frame" x="0.0" y="44.5" width="375" height="75"/>
                                <autoresizingMask key="autoresizingMask"/>
                                <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="St6-kz-bZE" id="gqt-AI-8vk">
                                    <rect key="frame" x="0.0" y="0.0" width="375" height="75"/>
@@ -1927,7 +1927,7 @@
                        <color key="backgroundColor" red="0.93725490199999995" green="0.93725490199999995" blue="0.95686274510000002" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
                        <prototypes>
                            <tableViewCell clipsSubviews="YES" contentMode="scaleToFill" selectionStyle="default" indentationWidth="10" reuseIdentifier="EZSettingCell" id="Mk7-Ag-WW0">
                                <rect key="frame" x="0.0" y="55.5" width="375" height="44"/>
                                <rect key="frame" x="0.0" y="49.5" width="375" height="44"/>
                                <autoresizingMask key="autoresizingMask"/>
                                <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="Mk7-Ag-WW0" id="Pt3-DC-cCE">
                                    <rect key="frame" x="0.0" y="0.0" width="375" height="44"/>
HDL-ON_iOS/Resources/EZ/Base.lproj/EZVideoTalkViewcontroller.xib
@@ -1,10 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="15705" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES">
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="20037" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES">
    <device id="retina5_9" orientation="portrait" appearance="light"/>
    <dependencies>
        <deployment version="2304" identifier="iOS"/>
        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="15706"/>
        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="20020"/>
        <capability name="Safe area layout guides" minToolsVersion="9.0"/>
        <capability name="System colors in document resources" minToolsVersion="11.0"/>
        <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
    </dependencies>
    <objects>
@@ -26,7 +27,7 @@
                        <rect key="frame" x="195" y="64" width="160" height="160"/>
                        <color key="backgroundColor" white="0.0" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
                    </view>
                    <button opaque="NO" contentMode="scaleToFill" horizontalHuggingPriority="249" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="9ko-k4-F0N">
                    <button opaque="NO" contentMode="scaleToFill" horizontalHuggingPriority="249" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="system" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="9ko-k4-F0N">
                        <rect key="frame" x="20" y="302" width="85" height="30"/>
                        <color key="backgroundColor" red="0.80782043147208116" green="0.80782043147208116" blue="0.80782043147208116" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
                        <state key="normal" title="创建房间">
@@ -42,7 +43,7 @@
                            <action selector="createRoomAction:" destination="333-bP-4tK" eventType="touchUpInside" id="rAq-LO-B2O"/>
                        </connections>
                    </button>
                    <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="qiF-2z-Rwj">
                    <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="system" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="qiF-2z-Rwj">
                        <rect key="frame" x="145" y="302" width="85" height="30"/>
                        <color key="backgroundColor" red="0.80782043150000005" green="0.80782043150000005" blue="0.80782043150000005" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
                        <state key="normal" title="加入房间">
@@ -73,7 +74,7 @@
                        <fontDescription key="fontDescription" type="system" pointSize="14"/>
                        <textInputTraits key="textInputTraits"/>
                    </textField>
                    <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="YO9-MU-r4L">
                    <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="system" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="YO9-MU-r4L">
                        <rect key="frame" x="270" y="302" width="85" height="30"/>
                        <color key="backgroundColor" red="0.80782043150000005" green="0.80782043150000005" blue="0.80782043150000005" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
                        <state key="normal" title="离开房间">
@@ -90,7 +91,8 @@
                        </connections>
                    </button>
                </subviews>
                <color key="backgroundColor" systemColor="systemBackgroundColor" cocoaTouchSystemColor="whiteColor"/>
                <viewLayoutGuide key="safeArea" id="gRk-Lv-awz"/>
                <color key="backgroundColor" systemColor="systemBackgroundColor"/>
                <constraints>
                    <constraint firstItem="YO9-MU-r4L" firstAttribute="height" secondItem="9ko-k4-F0N" secondAttribute="height" id="3hn-CA-7hn"/>
                    <constraint firstItem="3UU-E8-PbA" firstAttribute="leading" secondItem="gRk-Lv-awz" secondAttribute="leading" constant="20" id="4Rd-ZV-SEq"/>
@@ -116,7 +118,6 @@
                    <constraint firstItem="6Wf-7i-TE6" firstAttribute="centerY" secondItem="jc8-E1-NYw" secondAttribute="centerY" id="r2S-JH-0Bo"/>
                    <constraint firstItem="qiF-2z-Rwj" firstAttribute="leading" secondItem="9ko-k4-F0N" secondAttribute="trailing" constant="40" id="rkn-HZ-QQp"/>
                </constraints>
                <viewLayoutGuide key="safeArea" id="gRk-Lv-awz"/>
            </view>
            <connections>
                <outlet property="localView" destination="3UU-E8-PbA" id="JEa-Cq-Kuk"/>
@@ -126,4 +127,9 @@
            <point key="canvasLocation" x="-143.19999999999999" y="131.52709359605913"/>
        </viewController>
    </objects>
    <resources>
        <systemColor name="systemBackgroundColor">
            <color white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
        </systemColor>
    </resources>
</document>
HDL-ON_iOS/Resources/Language.ini
@@ -1120,7 +1120,7 @@
7155=Distress/Normal
7156=Distress
7157=whether to unlock
7158=is
7158=Is
7159=Fall in the alarm
7160=Someone called the police
7161=Warning tone
@@ -1128,9 +1128,22 @@
7163=Video call
7164=Manipulator
7165=Area intrusion alarm
7166=camera
7167=main switch
7166=Camera
7167=Main switch
7168=PM10
8501=Video door lock
8502=Electric quantity
8503=The door is now closed
8504=The door is not closed
8505=RVC
8506=One click to open the lock
8507=Temporary password
8508=History
8509=Fluorite video door lock
8510=Call from the doorbell
8511=User Education
@@ -2368,6 +2381,18 @@
7167=总控开关
7168=PM10
8501=视频门锁
8502=电量
8503=当前门已关
8504=当前门未关
8505=实时视频
8506=一键开锁
8507=临时密码
8508=历史记录
8509=萤石视频门锁
8510=来自“门铃”呼叫
8511=用户人员
 
HDL-ON_iOS/Resources/Phone/FunctionIcon/DoorLock/Cell.png
HDL-ON_iOS/Resources/Phone/FunctionIcon/DoorLock/HistoryList.png
HDL-ON_iOS/Resources/Phone/FunctionIcon/DoorLock/OneOpenLock.png
HDL-ON_iOS/Resources/Phone/FunctionIcon/DoorLock/RTV.png
HDL-ON_iOS/Resources/Phone/FunctionIcon/DoorLock/UnLocked.png
HDL-ON_iOS/Resources/Phone/FunctionIcon/DoorLock/UnLocking.png
HDL-ON_iOS/Resources/Phone/FunctionIcon/DoorLock/VideoDoorLockClose.png
HDL-ON_iOS/Resources/Phone/FunctionIcon/DoorLock/VideoDoorLockOpen.png
HDL-ON_iOS/Resources/Phone/FunctionIcon/FunctionBg/VideoDoorLockFunctionBg.png
HDL-ON_iOS/Resources/Phone/FunctionIcon/Icon/securitydoorezviz.png
HDL-ON_iOS/Resources/en.lproj/Localizable.strings
@@ -28,6 +28,9 @@
"get_info_fail"="Searching for failed. Poor network.";
"ad_input_manual"="Manual Input";
"ad_result_verify_local_lock"="Please verify the added primary user fingerprint, key or sensor card within 2 minutes. Click the Verified button after verification";
"ad_verified"="Verified";
"device_camera_list_title"="Device Channel List";
"device_input_vierify_code"="Input the device verification code.";
"device_verify_code_wrong"="Incorrect verification code.";
@@ -64,6 +67,46 @@
"device_account_pw_empty"="The user name or password is required.";
"device_lan_preview_title"="Live View via LAN";
"device_open"="Open";
"device_open_success"="Success to open the door!";
"device_please_input_door_password"="Input the unlock password";
"device_history"="History";
"device_his_no_more_data"="No more data";
"device_temp_pass"="Temporary password";
"device_temp_year"=".";
"device_temp_month"=".";
"device_temp_date"=".";
"device_temp_left"="Left";
"device_temp_times"="times";
"device_temp_save"="Save";
"device_temp_valid_date"="Term of validity";
"device_temp_valid_begin"="Begin";
"device_temp_valid_end"="End";
"device_temp_use_times"="Use times";
"device_temp_user"="User";
"device_temp_please_select"="Please select";
"device_temp_unlimited_times"="Unlimited";
"device_temp_sure"="Sure";
"device_temp_cancle"="Cancle";
"device_temp_please_input"="Please input";
"device_temp_input_use_count_describe"="Enter an integer from 1 to 100. Null means unlimited times";
"device_temp_input_pure_number"="Please enter a pure number";
"device_temp_input_valid_number"="Please enter a number between 1-100";
"device_temp_unit_year"="Y";
"device_temp_unit_month"="M";
"device_temp_unit_date"="D";
"device_temp_unit_hour"="h";
"device_temp_unit_minute"="m";
"device_temp_please_input_user_name"="Please input a user name";
"device_temp_please_select_begin_time"="Please select the start time";
"device_temp_please_select_end_time"="Please select the end time";
"device_temp_please_end_time_should_later"="The end time cannot be earlier than the start time";
"device_temp_unlimited_use_times"="Unlimited times";
"device_temp_total"="Total ";
"device_temp_copied"="Copied";
"device_temp_long_tap_copy"="Long press to copy";
"device_temp_sure_to_delete"="Are you sure to delete the temporary password?";
"dmessage_title"="Message";
"message_read"="Mark as Read";
"message_deleting"="Deleting. Please wait...";
HDL-ON_iOS/Resources/zh-Hans.lproj/Localizable.strings
@@ -69,6 +69,9 @@
"device_open"="开门";
"device_open_success"="开门成功!";
"device_please_input_door_password"="请输入开锁密码";
"device_history"="历史记录";
"device_his_no_more_data"="没有更多数据";
"device_temp_pass"="临时密码";
"device_temp_year"="年";
"device_temp_month"="月";
HDL_APP_Project.sln
@@ -18,6 +18,8 @@
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "UMSdk", "UMSdk\UMSdk.csproj", "{5CD1B2DE-1ABD-4B46-8C97-CCB6EA90346A}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ys", "..\ys\ys.csproj", "{DF065E3F-C3A1-4908-9582-000974B7C290}"
EndProject
Global
    GlobalSection(SharedMSBuildProjectFiles) = preSolution
        HDL_ON\HDL_ON.projitems*{09712674-2a38-407b-b1e2-560b2c352f9a}*SharedItemsImports = 4
@@ -119,6 +121,18 @@
        {5CD1B2DE-1ABD-4B46-8C97-CCB6EA90346A}.Release|iPhone.Build.0 = Release|Any CPU
        {5CD1B2DE-1ABD-4B46-8C97-CCB6EA90346A}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
        {5CD1B2DE-1ABD-4B46-8C97-CCB6EA90346A}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
        {DF065E3F-C3A1-4908-9582-000974B7C290}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
        {DF065E3F-C3A1-4908-9582-000974B7C290}.Debug|Any CPU.Build.0 = Debug|Any CPU
        {DF065E3F-C3A1-4908-9582-000974B7C290}.Debug|iPhone.ActiveCfg = Debug|Any CPU
        {DF065E3F-C3A1-4908-9582-000974B7C290}.Debug|iPhone.Build.0 = Debug|Any CPU
        {DF065E3F-C3A1-4908-9582-000974B7C290}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
        {DF065E3F-C3A1-4908-9582-000974B7C290}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
        {DF065E3F-C3A1-4908-9582-000974B7C290}.Release|Any CPU.ActiveCfg = Release|Any CPU
        {DF065E3F-C3A1-4908-9582-000974B7C290}.Release|Any CPU.Build.0 = Release|Any CPU
        {DF065E3F-C3A1-4908-9582-000974B7C290}.Release|iPhone.ActiveCfg = Release|Any CPU
        {DF065E3F-C3A1-4908-9582-000974B7C290}.Release|iPhone.Build.0 = Release|Any CPU
        {DF065E3F-C3A1-4908-9582-000974B7C290}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
        {DF065E3F-C3A1-4908-9582-000974B7C290}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
    EndGlobalSection
    GlobalSection(SolutionProperties) = preSolution
        HideSolutionNode = FALSE
HDL_ON/Common/ApiUtlis.cs
@@ -229,7 +229,7 @@
                                foreach (var newFunction in deviceList.list)
                                {
                                    newFunction.AssembleStatus();
                                    newFunction.SaveFunctionFile();
                                    newFunction.SaveFunctionFile();
                                    FunctionList.List.IniFunctionList(newFunction.savePath,true);
                                    MainPage.Log($"============设备============{iiii++}");
                                }
@@ -314,6 +314,7 @@
                                //======================登录全视通====================
                                if (isInterphoneType_FREEVIEW)
                                {
#if __IOS__
                                    List<VisitorTempPassword> dataList = new List<VisitorTempPassword>();
                                    Dictionary<string, object> dictionary = new Dictionary<string, object>();
HDL_ON/Common/Constant.cs
@@ -309,6 +309,10 @@
        /// HDL可视对讲
        /// </summary>
        HDL_INTERPHONE,
        /// <summary>
        /// 门铃推送(萤石视频门锁)
        /// </summary>
        DOOR_BELL,
    }
    /// <summary>
HDL_ON/Common/HDLCommon.cs
@@ -7,7 +7,6 @@
using HDL_ON.Entity;
using System.Threading;
using HDL_ON.DriverLayer;
namespace HDL_ON
{
    /// <summary>
@@ -278,6 +277,8 @@
                    {
                        //报警推送弹窗提示
                        ShowAlarmPushMessage(jpushMessageInfo, true);
                        //萤石门锁推送
                        HDL_ON.UI.UI2.FuntionControlView.VideoDoorLock.CommonMethod.Current.DoorLockPush(jpushMessageInfo);
                    }
                    else if (jpushMessageInfo.messageType.Contains(PushMessageType.FLCall.ToString()))
                    {
@@ -304,8 +305,9 @@
                    }
                    else if (jpushMessageInfo.messageType.Contains(PushMessageType.HDL_INTERPHONE.ToString()))
                    {
                        if (string.IsNullOrEmpty(jpushMessageInfo.expantContent)) return;
                        //字段兼容问题,只能直接取值了
                        var json = Newtonsoft.Json.Linq.JObject.Parse(jpushMessageInfo.expantContent);
                        try
@@ -385,7 +387,15 @@
                    else if (jpushMessageInfo.messageType.Contains(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()))
                    {
                        //萤石门锁推送
                        HDL_ON.UI.UI2.FuntionControlView.VideoDoorLock.CommonMethod.Current.DoorLockPush(jpushMessageInfo);
                    }
                }
            }
            catch (Exception EX)
@@ -395,12 +405,12 @@
        }
        //{"code":0,"data":{"list":[{"createTime":"1625798305115","modifyTime":"1625798305115","region":"100000000000000001","id":"1413326644794294273","alarmId":"20210709103818-F41014762-1-10000","channelNo":1,"deviceSerial":"F41014762","alarmName":"人体感应事件","alarmPicUrl":"https://i.ys7.com/streamer/alarm/url/get?fileId=20210709103818-F41014762-1-10000-2-1&deviceSerialNo=F41014762&cn=1&isEncrypted=0&isCloudStored=0&ct=1&lc=7&bn=1_hikalarm&isDevVideo=0","alarmTime":"2021-07-09T10:38:17","homeId":"1396717478877241345","alarmType":"pir","isChecked":0,"isEncrypt":0,"deleted":0,"tenantId":"20"},{"createTime":"1625798057197","modifyTime":"1625798057197","region":"100000000000000001","id":"1413325604946640898","alarmId":"20210709103413-F41014762-1-10000","channelNo":1,"deviceSerial":"F41014762","alarmName":"人体感应事件","alarmPicUrl":"https://i.ys7.com/streamer/alarm/url/get?fileId=20210709103413-F41014762-1-10000-2-1&deviceSerialNo=F41014762&cn=1&isEncrypted=0&isCloudStored=0&ct=1&lc=7&bn=1_hikalarm&isDevVideo=0","alarmTime":"2021-07-09T10:34:12","homeId":"1396717478877241345","alarmType":"pir","isChecked":0,"isEncrypt":0,"deleted":0,"tenantId":"20"},{ "createTime":"1625797973320","modifyTime":"1625797973320","region":"100000000000000001","id":"1413325253141004289","alarmId":"20210709103236-F41014762-1-10000","channelNo":1,"deviceSerial":"F41014762","alarmName":"人体感应事件","alarmPicUrl":"https://i.ys7.com/streamer/alarm/url/get?fileId=20210709103236-F41014762-1-10000-2-1&deviceSerialNo=F41014762&cn=1&isEncrypted=0&isCloudStored=0&ct=1&lc=7&bn=1_hikalarm&isDevVideo=0","alarmTime":"2021-07-09T10:32:31","homeId":"1396717478877241345","alarmType":"pir","isChecked":0,"isEncrypt":0,"deleted":0,"tenantId":"20"},{ "createTime":"1625797782136","modifyTime":"1625797782136","region":"100000000000000001","id":"1413324451261382658","alarmId":"20210709102937-F41014762-1-10000","channelNo":1,"deviceSerial":"F41014762","alarmName":"人体感应事件","alarmPicUrl":"https://i.ys7.com/streamer/alarm/url/get?fileId=20210709102937-F41014762-1-10000-2-1&deviceSerialNo=F41014762&cn=1&isEncrypted=0&isCloudStored=0&ct=1&lc=7&bn=1_hikalarm&isDevVideo=0","alarmTime":"2021-07-09T10:29:37","homeId":"1396717478877241345","alarmType":"pir","isChecked":0,"isEncrypt":0,"deleted":0,"tenantId":"20"},{ "createTime":"1625797668771","modifyTime":"1625797668771","region":"100000000000000001","id":"1413323975769915394","alarmId":"20210709102743-F41014762-1-10000","channelNo":1,"deviceSerial":"F41014762","alarmName":"人体感应事件","alarmPicUrl":"https://i.ys7.com/streamer/alarm/url/get?fileId=20210709102743-F41014762-1-10000-2-1&deviceSerialNo=F41014762&cn=1&isEncrypted=0&isCloudStored=0&ct=1&lc=7&bn=1_hikalarm&isDevVideo=0","alarmTime":"2021-07-09T10:27:42","homeId":"1396717478877241345","alarmType":"pir","isChecked":0,"isEncrypt":0,"deleted":0,"tenantId":"20"},{ "createTime":"1625797539846","modifyTime":"1625797539846","region":"100000000000000001","id":"1413323435023466498","alarmId":"20210709102534-F41014762-1-10000","channelNo":1,"deviceSerial":"F41014762","alarmName":"人体感应事件","alarmPicUrl":"https://i.ys7.com/streamer/alarm/url/get?fileId=20210709102534-F41014762-1-10000-2-1&deviceSerialNo=F41014762&cn=1&isEncrypted=0&isCloudStored=0&ct=1&lc=7&bn=1_hikalarm&isDevVideo=0","alarmTime":"2021-07-09T10:25:34","homeId":"1396717478877241345","alarmType":"pir","isChecked":0,"isEncrypt":0,"deleted":0,"tenantId":"20"},{ "createTime":"1625797530627","modifyTime":"1625797530627","region":"100000000000000001","id":"1413323396351983618","alarmId":"20210709102525-F41014762-1-10000","channelNo":1,"deviceSerial":"F41014762","alarmName":"人体感应事件","alarmPicUrl":"https://i.ys7.com/streamer/alarm/url/get?fileId=20210709102525-F41014762-1-10000-2-1&deviceSerialNo=F41014762&cn=1&isEncrypted=0&isCloudStored=0&ct=1&lc=7&bn=1_hikalarm&isDevVideo=0","alarmTime":"2021-07-09T10:25:25","homeId":"1396717478877241345","alarmType":"pir","isChecked":0,"isEncrypt":0,"deleted":0,"tenantId":"20"},{ "createTime":"1625796028089","modifyTime":"1625796028089","region":"100000000000000001","id":"1413317094255034369","alarmId":"20210709100024-F41014762-1-10000","channelNo":1,"deviceSerial":"F41014762","alarmName":"人体感应事件","alarmPicUrl":"https://i.ys7.com/streamer/alarm/url/get?fileId=20210709100024-F41014762-1-10000-2-1&deviceSerialNo=F41014762&cn=1&isEncrypted=0&isCloudStored=0&ct=1&lc=7&bn=1_hikalarm&isDevVideo=0","alarmTime":"2021-07-09T10:00:23","homeId":"1396717478877241345","alarmType":"pir","isChecked":0,"isEncrypt":0,"deleted":0,"tenantId":"20"},{ "createTime":"1625795974558","modifyTime":"1625795974558","region":"100000000000000001","id":"1413316869729746946","alarmId":"20210709095931-F41014762-1-10000","channelNo":1,"deviceSerial":"F41014762","alarmName":"人体感应事件","alarmPicUrl":"https://i.ys7.com/streamer/alarm/url/get?fileId=20210709095931-F41014762-1-10000-2-1&deviceSerialNo=F41014762&cn=1&isEncrypted=0&isCloudStored=0&ct=1&lc=7&bn=1_hikalarm&isDevVideo=0","alarmTime":"2021-07-09T09:59:31","homeId":"1396717478877241345","alarmType":"pir","isChecked":0,"isEncrypt":0,"deleted":0,"tenantId":"20"},{ "createTime":"1625795966933","modifyTime":"1625795966933","region":"100000000000000001","id":"1413316837748178946","alarmId":"20210709095923-F41014762-1-10000","channelNo":1,"deviceSerial":"F41014762","alarmName":"人体感应事件","alarmPicUrl":"https://i.ys7.com/streamer/alarm/url/get?fileId=20210709095923-F41014762-1-10000-2-1&deviceSerialNo=F41014762&cn=1&isEncrypted=0&isCloudStored=0&ct=1&lc=7&bn=1_hikalarm&isDevVideo=0","alarmTime":"2021-07-09T09:59:22","homeId":"1396717478877241345","alarmType":"pir","isChecked":0,"isEncrypt":0,"deleted":0,"tenantId":"20"}],"totalCount":"13","totalPage":"2","pageNo":"1","pageSize":"10"},"timestamp":"1625807415164","isSuccess":true}
        //{"platform":"1","timestamp":"1625805660249","appKey":"HDL-HOME-APP-TEST","sign":"02e433c40485b30451ebdc5ca3cd959c","deviceSerial":"F41014762","homeId":"1396717478877241345"}
    /// <summary>
    /// 解析丰林可视对讲推送数据
    /// </summary>
    /// <param name="jsonStr"></param>
    /// <returns></returns>
    ESVideoInfo GetESOnVideoJson(string jsonStr)
        /// <summary>
        /// 解析丰林可视对讲推送数据
        /// </summary>
        /// <param name="jsonStr"></param>
        /// <returns></returns>
        ESVideoInfo GetESOnVideoJson(string jsonStr)
        {
            try
            {
@@ -467,7 +477,7 @@
                    //5.全视通登出
                    Shared.IOS.HDLFVSDK.Video.Logout();
                    //6.清空Siri共享数据信息
                    new Other.SkipControl().SetData(false, "", "", "","");
                    new Other.SkipControl().SetData(false, "", "", "", "");
                    var sDM = new SiriKit.SceneDateManager();
                    Console.WriteLine($"IsLogin:{sDM.IsLgoin};accessToken:{sDM.AccessToken};refreshToken:{sDM.RefreshToken};RegionUrl:{sDM.RegionUrl};HomeId:{sDM.HomeId}");
#endif
@@ -572,9 +582,9 @@
        }
#endregion
        #endregion
#region ■ 常用方法_______________________
        #region ■ 常用方法_______________________
        /// <summary>
        /// 设置下划线按钮状态
        /// 统一封装设置方法
@@ -649,9 +659,9 @@
                Control.Ins.SearchLoaclGateway();
            }
        }
#endregion
        #endregion
#region 跳转打开萤石云方法
        #region 跳转打开萤石云方法
        /// <summary>
        /// 获取子账号token并跳转设备列表页面
@@ -667,6 +677,7 @@
            {
                try
                {
                    var list = UI.UI2.FuntionControlView.VideoDoorLock.CommonMethod.Current.GetVideoDoorLockLockModelsList();
                    //先获取萤石云子账号token
                    var result = new HttpServerRequest().EZGetChildToken();
                    if (result.Code == StateCode.SUCCESS)
@@ -678,7 +689,9 @@
                        {
                            if (!string.IsNullOrEmpty(ezChildAccessToken))
                            {
#if __IOS__
                                //iOS
                                //初始化萤石云SDK,中文国内key、英文海外key 开发者账号使用应用包名申请的APPKEY,不同包名应用需配置不同的APPKEY
                                EZSDK.IOS.EZSDK.SharedInstance().InitLibWithAppKey("1aa98a90489b4838b966b57018b4b04b", "1aa98a90489b4838b966b57018b4b04b");
@@ -687,16 +700,25 @@
                                EZSDK.IOS.EZSDK.SharedInstance().SetRequestHttpsHostAndPlatform(OnAppConfig.Instance.RequestHttpsHost, 1, DB_ResidenceData.Instance.CurrentRegion.id);
                                //2.设置萤石子账号的AccessToken到SDK
                                EZSDK.IOS.EZSDK.SharedInstance().SetEZAccessToken(ezChildAccessToken);
                                //Console.WriteLine("loginToken:" + UserInfo.Current.LoginTokenString);
                                //Console.WriteLine("refreshToken:" + UserInfo.Current.RefreshToken);
                                ////3.打开摄像头设备列表页面
                                EZSDK.IOS.EZSDK.SharedInstance().Go2EZvizMonitor();
                                //////3.打开摄像头设备列表页面
                                //EZSDK.IOS.EZSDK.SharedInstance().Go2EZvizMonitor();
                                //EZSDK.IOS.EZDeviceInfo info = new EZSDK.IOS.EZDeviceInfo();
                                //info.de
                                //EZSDK.IOS.EZSDK.Play(info);
                                //2023年03月29日13:08:35 修改
                                Foundation.NSObject[] nSObject = new Foundation.NSObject[list.Count];
                                for (int i = 0; i < list.Count; i++)
                                {
                                    string strValue = list[i];
                                    nSObject[i] = new Foundation.NSString(strValue);
                                }
                                EZSDK.IOS.EZSDK.SharedInstance().ToEZDeviceListViewWithFilterTypes(nSObject);
#else
                                //Android
                                //1.设置所需河东的token、域名地址
@@ -708,21 +730,24 @@
                                    {
                                        ((BaseActivity)Shared.Application.Activity).SetPermission(result =>
                                        {
                                            if(result)
                                            {
                                            Android.Content.Intent intent = new Android.Content.Intent();
                                            var bundle = new Android.OS.Bundle();
                                            //传递name参数为tinyphp
                                            bundle.PutString("EzChildAccessToken", ezChildAccessToken);
                                            bundle.PutString("HdlToken", UserInfo.Current.LoginTokenString);
                                            bundle.PutString("Url", OnAppConfig.Instance.RequestHttpsHost);
                                            bundle.PutString("EzvizAppKey", "1aa98a90489b4838b966b57018b4b04b");
                                            bundle.PutInt("Platform", 1);
                                            bundle.PutString("HomeId", DB_ResidenceData.Instance.CurrentRegion.id);
                                            intent.PutExtras(bundle);
                                            intent.SetComponent(new Android.Content.ComponentName(Shared.Application.Activity, "com.videogo.MainActivity"));
                                            Shared.Application.Activity.StartActivity(intent);
                                            }
                                            //2023年03月29日13:08:35 修改
                                            Com.Videogo.Hdl.HDLEzvizSdk.Instance.Init(Application.Activity.Application, ezChildAccessToken, UserInfo.Current.LoginTokenString, UserInfo.Current.RefreshToken, OnAppConfig.Instance.RequestHttpsHost, "1aa98a90489b4838b966b57018b4b04b", 1, DB_ResidenceData.Instance.CurrentRegion.id);
                                            Com.Videogo.Hdl.HDLEzvizSdk.Instance.JumpToCameraListActivity(Shared.Application.Activity, list);
                                            //if (result)
                                            //{
                                            //    Android.Content.Intent intent = new Android.Content.Intent();
                                            //    var bundle = new Android.OS.Bundle();
                                            //    //传递name参数为tinyphp
                                            //    bundle.PutString("EzChildAccessToken", ezChildAccessToken);
                                            //    bundle.PutString("HdlToken", UserInfo.Current.LoginTokenString);
                                            //    bundle.PutString("Url", OnAppConfig.Instance.RequestHttpsHost);
                                            //    bundle.PutString("EzvizAppKey", "1aa98a90489b4838b966b57018b4b04b");
                                            //    bundle.PutInt("Platform", 1);
                                            //    bundle.PutString("HomeId", DB_ResidenceData.Instance.CurrentRegion.id);
                                            //    intent.PutExtras(bundle);
                                            //    intent.SetComponent(new Android.Content.ComponentName(Shared.Application.Activity, "com.videogo.MainActivity"));
                                            //    Shared.Application.Activity.StartActivity(intent);
                                            //}
                                        }, "android.permission.RECORD_AUDIO");
                                    }
@@ -757,6 +782,6 @@
            { IsBackground = true }.Start();
        }
#endregion
        #endregion
    }
}
HDL_ON/Common/R.cs
@@ -2062,11 +2062,11 @@
        /// <summary>
        /// 循序循环
        /// </summary>
        public const int orderMode =5048;
        public const int orderMode = 5048;
        /// <summary>
        /// 单曲播放
        /// </summary>
        public const int single =5049;
        public const int single = 5049;
@@ -3122,7 +3122,59 @@
        /// <summary>
        /// PM210
        /// </summary>
        public const int pm10= 7168;
        public const int pm10 = 7168;
        /// <summary>
        /// 视频门锁
        /// </summary>
        public const int shipinmensuo = 8501;
        /// <summary>
        /// 电量
        /// </summary>
        public const int dianliang = 8502;
        /// <summary>
        /// 当前门已关
        /// </summary>
        public const int dangqianmenyiguan = 8503;
        /// <summary>
        /// 当前门未关
        /// </summary>
        public const int dangqianmenweiguan = 8504;
        /// <summary>
        /// 实时视频
        /// </summary>
        public const int shishishipin = 8505;
        /// <summary>
        /// 一键开锁
        /// </summary>
        public const int yijiankaisuo = 8506;
        /// <summary>
        /// 临时密码
        /// </summary>
        public const int linshimima1 = 8507;
        /// <summary>
        /// 历史记录
        /// </summary>
        public const int lishijilu = 8508;
        /// <summary>
        /// 萤石视频门锁
        /// </summary>
        public const int yingshishipinmensuo = 8509;
        /// <summary>
        /// 来自“门铃”呼叫
        /// </summary>
        public const int laizimenlinghujiao = 8510;
        /// <summary>
        /// 用户人员
        /// </summary>
        public const int yonghurenyuan = 8511;
HDL_ON/DAL/DriverLayer/Control.cs
@@ -83,8 +83,10 @@
        /// <summary>
        /// 判断是否本地加密并且加密key不为空
        /// </summary>
        public bool IsLocalEncryptAndGetAesKey {
            get {
        public bool IsLocalEncryptAndGetAesKey
        {
            get
            {
                return IsLocalEncrypt && (!string.IsNullOrEmpty(DB_ResidenceData.Instance.CurrentRegion.localSecret));
            }
        }
@@ -139,7 +141,7 @@
                if (_GatewayOnline_Cloud != value)
                {
                    _GatewayOnline_Cloud = value;
                    if(GatewayOnline_Local)
                    if (GatewayOnline_Local)
                    {
                        return;
                    }
@@ -249,7 +251,7 @@
        public void SearchLoaclGateway()
        {
            //2021-01-15 : 住宅没有绑定网关的时候不用搜索,并且不能链接mqtt
            if(DB_ResidenceData.Instance.HomeGateway == null || string.IsNullOrEmpty(DB_ResidenceData.Instance.HomeGateway.gatewayId))
            if (DB_ResidenceData.Instance.HomeGateway == null || string.IsNullOrEmpty(DB_ResidenceData.Instance.HomeGateway.gatewayId))
            {
                return;
            }
@@ -308,9 +310,10 @@
        /// </summary>
        public void LoginGateway()
        {
            if(loginGatewayThread== null)
            if (loginGatewayThread == null)
            {
                loginGatewayThread = new System.Threading.Thread(() => {
                loginGatewayThread = new System.Threading.Thread(() =>
                {
                    while (!Ins.myTcpClient.isConnected)
                    {
                        if (Ins.GatewayOnline_Local && myTcpClient.isConnected)
@@ -337,7 +340,8 @@
                try
                {
                    loginGatewayThread?.Abort();
                }catch (Exception ex)
                }
                catch (Exception ex)
                {
                    MainPage.Log($"重启登录网关线程异常:{ex.Message}");
                }
@@ -347,7 +351,7 @@
                    LoginGateway();
                }
            }
        }
@@ -357,9 +361,9 @@
        public void ControlScene(Scene scene)
        {
            //体验模式
            if(MainPage.NoLoginMode)
            if (MainPage.NoLoginMode)
            {
                foreach(var sceneFunction in scene.functions)
                foreach (var sceneFunction in scene.functions)
                {
                    var revString = "";
                    var upDataObj = new AlinkFunctionStatusObj();
@@ -406,7 +410,7 @@
        /// <param name="function"></param>
        /// <param name="useRemote">是否直接使用远程发送</param>
        /// <returns></returns>
        public bool SendWriteCommand(Function function, Dictionary<string, string> commandDictionary, bool useRemote = false,int resend = 3)
        public bool SendWriteCommand(Function function, Dictionary<string, string> commandDictionary, bool useRemote = false, int resend = 3)
        {
            function.controlCounter++;
            function.refreshTime = DateTime.Now;
@@ -504,7 +508,7 @@
                        var functionControlDataObj = function.GetGatewayAlinkControlData(commandDictionary);
                        var functionControlDataJson = Newtonsoft.Json.JsonConvert.SerializeObject(functionControlDataObj);
                        var sendBytes = Ins.ConvertSendBodyData(CommunicationTopic.ct.ControlFunctionTopic, functionControlDataJson);
                        new Control_Udp().SendLocalHdlLinkData(sendBytes, functionControlDataObj.id,resend);
                        new Control_Udp().SendLocalHdlLinkData(sendBytes, functionControlDataObj.id, resend);
                        MainPage.Log($"本地通讯 发送HDL-Link数据:{functionControlDataJson}");
                    }
                }
@@ -522,7 +526,7 @@
                                commandDictionary.Add(FunctionAttributeKey.OnOff, commandDictionary[FunctionAttributeKey.Brightness] == "0" ? "off" : "on");
                            }
                        }
                        if(function.spk == SPK.LightCCT)
                        if (function.spk == SPK.LightCCT)
                        {
                            if (!commandDictionary.ContainsKey(FunctionAttributeKey.CCT))
                            {
@@ -546,10 +550,10 @@
        /// <summary>
        /// 全开全关功能
        /// </summary>
        public void SwtichFunctions(bool open,List<Function> functions)
        public void SwtichFunctions(bool open, List<Function> functions)
        {
            //dome模式控制
            if(MainPage.NoLoginMode)
            if (MainPage.NoLoginMode)
            {
                new System.Threading.Thread(() =>
                {
@@ -557,7 +561,7 @@
                    {
                        Dictionary<string, string> d1 = new Dictionary<string, string>();
                        d1.Add(FunctionAttributeKey.OnOff, open ? "on" : "off");
                         if (function.spk == SPK.PanelSocket)
                        if (function.spk == SPK.PanelSocket)
                        {
                            if (function.attributes.Find((obj) => obj.key == "on_off_usb") != null)
                            {
@@ -623,16 +627,16 @@
        {
            var pm = new DAL.Server.HttpServerRequest();
            var pack = pm.GetDeviceInfoList(functionIds);
            if(pack!= null&& pack.Data!=null)
            if (pack != null && pack.Data != null)
            {
                //待测试2021-03-04
                var ddd = Newtonsoft.Json.JsonConvert.DeserializeObject<List<AlinkStatusData>>(pack.Data.ToString());
                if(ddd!= null)
                if (ddd != null)
                {
                    foreach(var function in ddd)
                    foreach (var function in ddd)
                    {
                        var temp = FunctionList.List.GetDeviceFunctionList().Find((obj) => obj.deviceId == function.deviceId);
                        if(temp!= null)
                        if (temp != null)
                        {
                            if (SPK.Get3tySpk(SPK.BrandType.Tuya).Contains(temp.spk))
                            {
@@ -648,7 +652,7 @@
        /// 发送读取命令
        /// 自动判断是否为A协议设备
        /// </summary>
        public void SendReadCommand(Function function ,bool forceRemote = false)
        public void SendReadCommand(Function function, bool forceRemote = false)
        {
            function.refreshTime = DateTime.Now;
            if (forceRemote)
@@ -732,7 +736,7 @@
                            {
                                busClient.ReadBusData(function);
                            }
                        }
                        catch (Exception ex)
                        {
@@ -776,7 +780,7 @@
        /// <summary>
        /// 安防控制
        /// </summary>
        public void ControlSecurity(SecurityAlarm securityAlarm,string state)
        public void ControlSecurity(SecurityAlarm securityAlarm, string state)
        {
            if (!Ins.GatewayOnline_Local)//网关本地不在线
            {
@@ -834,7 +838,7 @@
                };
                var aLinkJson = Newtonsoft.Json.JsonConvert.SerializeObject(aLinkData);
                var sendBytes = Ins.ConvertSendBodyData(CommunicationTopic.ct.ControlScene, aLinkJson);
                new Control_Udp().SendLocalHdlLinkData(sendBytes, aLinkData.id,0);
                new Control_Udp().SendLocalHdlLinkData(sendBytes, aLinkData.id, 0);
            }
        }
@@ -928,10 +932,10 @@
        /// 转换接收到的数据
        /// </summary>
        /// <returns></returns>
        public void ConvertReceiveData(byte[] receiveBytes,string ip)
        public void ConvertReceiveData(byte[] receiveBytes, string ip)
        {
            var reString = Encoding.UTF8.GetString(receiveBytes);
            AnalysisReceiveData(reString, receiveBytes,ip);
            AnalysisReceiveData(reString, receiveBytes, ip);
        }
        /// <summary>
        /// 转换接收到的数据
@@ -939,7 +943,7 @@
        /// <param name="receiveString">转String后的数据</param>
        /// <param name="originalReceiveBytes"原始Bytes数据</param>
        /// <returns></returns>
        public LocalCommunicationData AnalysisReceiveData(string receiveString, byte[] originalReceiveBytes , string sIp = null)
        public LocalCommunicationData AnalysisReceiveData(string receiveString, byte[] originalReceiveBytes, string sIp = null)
        {
            LocalCommunicationData receiveObj = new LocalCommunicationData();
@@ -1118,7 +1122,8 @@
                        MainPage.Log($"安防局域网异常:{ex.Message}");
                    }
                }
                else if (receiveObj.Topic == $"/user/{GatewayId}/custom/gateway/login_reply") {
                else if (receiveObj.Topic == $"/user/{GatewayId}/custom/gateway/login_reply")
                {
                    var temp = Newtonsoft.Json.JsonConvert.DeserializeObject<JObject>(receiveObj.BodyDataString);
                    if (temp.GetValue("objects").ToString().Contains("success"))
                    {
@@ -1161,7 +1166,7 @@
            }
            else
            {
                if(processedDataList.Count> 50)
                if (processedDataList.Count > 50)
                {
                    processedDataList.RemoveAt(0);
                }
@@ -1175,7 +1180,7 @@
        /// A协议数据
        /// </summary>
        /// <param name="updateBytes"></param>
        public void UpdataFunctionStatus(string revString, byte[] usefulBytes,bool isCloudData = false)
        public void UpdataFunctionStatus(string revString, byte[] usefulBytes, bool isCloudData = false)
        {
            ////test 云端连接成功时,不适用本地数据更新
            //if (Ins.GatewayOnline_Cloud && !isCloudData)
@@ -1218,7 +1223,7 @@
                        if (Ins.GatewayOnline_Local && isCloudData)//本地链接,除了涂鸦设备数据之外的云端数据不处理
                        {
                            if (!SPK.Get3tySpk(SPK.BrandType.All3tyBrand).Contains(localFunction.spk) && !SPK.MusicSpkList().Contains( localFunction.spk))
                            if (!SPK.Get3tySpk(SPK.BrandType.All3tyBrand).Contains(localFunction.spk) && !SPK.MusicSpkList().Contains(localFunction.spk))
                            {
                                //MainPage.Log($"A协议更新状态:本地链接,除了涂鸦设备数据之外的云端数据不处理........");
@@ -1255,7 +1260,7 @@
                                break;
                            case SPK.AirSwitch:
                                AirSwitchPage.UpdataState(localFunction);
                                if(localFunction.GetAttribute(FunctionAttributeKey.Power)!=null)//如果是带电量的空开也要更新能源界面
                                if (localFunction.GetAttribute(FunctionAttributeKey.Power) != null)//如果是带电量的空开也要更新能源界面
                                {
                                    EnergyMainPage.UpdataStatus(localFunction);
                                }
@@ -1294,7 +1299,7 @@
                                CurtainModulePage.UpdataState(localFunction);
                                break;
                            case SPK.CurtainDream:
                                if(localFunction.GetAttrState(FunctionAttributeKey.Percent) == "0")
                                if (localFunction.GetAttrState(FunctionAttributeKey.Percent) == "0")
                                {
                                    localFunction.SetAttrState(FunctionAttributeKey.OnOff, "off");
                                }
@@ -1387,7 +1392,7 @@
                            case SPK.SensorTemperature:
                            case SPK.SensorHumidity:
                            case SPK.SensorHcho:
                                if(localFunction.spk == SPK.SensorTemperature)
                                if (localFunction.spk == SPK.SensorTemperature)
                                {
                                    HomePage.LoadEvent_RefreshEnvirIndoorTemp();
                                }
@@ -1489,7 +1494,7 @@
                            case SPK.AvMusic:
                            case SPK.MusicStandard:
                                //UI.Music.MusicMain.mMusicMain.RefreshView(updateTemp);
                                Console.WriteLine("音乐播放器显示状态======="+ revString);
                                Console.WriteLine("音乐播放器显示状态=======" + revString);
                                //wjc
                                break;
                            case SPK.Inverter:
@@ -1523,12 +1528,12 @@
        /// <summary>
        /// //一键(远程)开锁
        /// </summary>
        public void OneKeyUnlocking(Function doorlock,string extStr)
        public void OneKeyUnlocking(Function doorlock, string extStr)
        {
            if (Ins.GatewayOnline_Local)
            {
                Dictionary<string, string> dic = new Dictionary<string, string>();
                var functionControlDataObj = doorlock.GetGatewayAlinkDoorlockData(UserInfo.Current.ID,extStr);
                var functionControlDataObj = doorlock.GetGatewayAlinkDoorlockData(UserInfo.Current.ID, extStr);
                var functionControlDataJson = Newtonsoft.Json.JsonConvert.SerializeObject(functionControlDataObj);
                var sendBytes = Ins.ConvertSendBodyData($"/base/{Control.Ins.GatewayId}/thing/service/doorRemoteOpen/down", functionControlDataJson);
                new Control_Udp().SendLocalHdlLinkData(sendBytes, functionControlDataObj.id, 0);
@@ -1543,7 +1548,7 @@
        /// </summary>
        /// <param name="functionId"></param>
        /// <param name="pwd"></param>
        public void ConfirmUnlocking(string functionId,string pwd)
        public void ConfirmUnlocking(string functionId, string pwd)
        {
            Loading loading = new Loading();
            MainPage.BaseView.AddChidren(loading);
@@ -1579,8 +1584,10 @@
                        //{
                        //    return false;
                        //}
                        if (pack.Code != StateCode.SUCCESS) {
                            Application.RunOnMainThread(() => {
                        if (pack.Code != StateCode.SUCCESS)
                        {
                            Application.RunOnMainThread(() =>
                            {
                                new PublicAssmebly().TipMsg(Language.StringByID(StringId.Tip), pack.message);
                                UserInfo.Current.doorPasswordString = "";//
                                UserInfo.Current.LastTimeOpenDoor = DateTime.MinValue;
@@ -1589,8 +1596,9 @@
                    }
                    if (pack.Code != StateCode.SUCCESS)
                    {
                        Application.RunOnMainThread(() => {
                            if(string.IsNullOrEmpty(pack.message))
                        Application.RunOnMainThread(() =>
                        {
                            if (string.IsNullOrEmpty(pack.message))
                            {
                                new PublicAssmebly().TipMsg(Language.StringByID(StringId.Tip),
                                    Language.StringByID(StringId.OperationFailed));
HDL_ON/DAL/Server/HttpServerRequest.cs
@@ -2928,9 +2928,25 @@
        }
#endregion
        /// <summary>
        /// 获取第三方注册的id
        /// </summary>
        /// <param homeId="homeId">住宅id</param>
        /// <returns></returns>
        public ResponsePackNew GetExtUserId(string homeId)
        {
            Dictionary<string, object> d = new Dictionary<string, object>();
            d.Add("homeId", homeId);
#region ■ 门锁相关____________________________
            var requestJson = HttpUtil.GetSignRequestJson(d);
            var pack = HttpUtil.RequestHttpsPostFroHome(NewAPI.Api_Post_GetExtUserId, requestJson);
            return pack;
        }
        #endregion
        #region ■ 门锁相关____________________________
        /// <summary>
        /// 获取门锁历史记录(按日期降序)
HDL_ON/DAL/Server/NewAPI.cs
@@ -474,6 +474,47 @@
        /// 设备消息规则配置
        /// </summary>
        public const string Api_Post_DeviceMessageRulesSet = "/home-wisdom/app/device/deviceMessageRulesSet";
        #endregion
        #region Kaede -- 萤石视频门锁接口____________________________
        /// <summary>
        /// 删除设备(萤石视频门锁)
        /// </summary>
        public const string Api_Post_DeleteDevice = "/home-wisdom/platform/yingshi/child/deleteDevice";
        /// <summary>
        /// 电池详情(萤石视频门锁)
        /// </summary>
        public const string Api_Post_Details = "/home-wisdom/platform/yingshi/lock/battery/details";
        /// <summary>
        /// 门锁用户列表(萤石视频门锁)
        /// </summary>
        public const string Api_Post_UserList = "/home-wisdom/platform/yingshi/lock/user/list";
        /// <summary>
        /// 门锁状态(萤石视频门锁)
        /// </summary>
        public const string Api_Post_Lockstatus = "/home-wisdom/platform/yingshi/lock/status";
        /// <summary>
        /// 获取报警列表(萤石视频门锁)
        /// </summary>
        public const string Api_Post_Records = "/home-wisdom/platform/yingshi/alarm/records";
        /// <summary>
        /// 删除报警记录(萤石视频门锁)
        /// </summary>
        public const string Api_Post_AlarmDelet= "/home-wisdom/platform/yingshi/alarm/delete";
        /// <summary>
        /// 远程开锁(萤石视频门锁)
        /// </summary>
        public const string Api_Post_OpenDoor = "/home-wisdom/platform/yingshi/lock/remote/open/door";
        /// <summary>
        /// 门锁型号列表(萤石视频门锁)
        /// </summary>
        public const string Api_Post_Lock_Models = "/home-wisdom/platform/yingshi/lock/models";
        #endregion
        #region Kaede -- 场景接口____________________________
@@ -802,7 +843,10 @@
        /// </summary>
        public const string Api_Post_GetListHomeFace = "/home-wisdom/app/logic/listHomeFace";
        /// <summary>
        /// 获第三方注册userId
        /// </summary>
        public const string Api_Post_GetExtUserId = "/community-wisdom/app/visitor/freeview/getExtMemberInfo";
        #endregion
HDL_ON/DAL/ThirdPartySdk/ESOnVideo.cs
@@ -82,7 +82,7 @@
            if (interphoneType == InterphoneType.IMOUVISIAL.ToString())
            {
                //乐橙可视对讲
                //1.初始化LCOpenSDK_Api
                //1.初始化LCOpenSDK_Api(Shared.IOS.LCVideoOnSDK)
                LCApiKit.SharedInstance().IsChinaMainland = GetIsChinaMainland();
                LCApiKit.SharedInstance().InitSDKOpenApi(mESVideoInfo.Lc_AccessToken);
                LCApiKit.SharedInstance().CurrentDevicePlayToken = mESVideoInfo.Lc_PlayToken;
@@ -98,12 +98,11 @@
            }
            else if(interphoneType == InterphoneType.FLVI.ToString())
            {
                //Shared.IOS.ESVideoOnSDK
                ESOnMonitorViewController vc = new ESOnMonitorViewController();
                vc.MESVideoID = mESVideoInfo.ESVideoUUID;
                vc.MESRoomID = roomID;
                vc.DeviceName = mESVideoInfo.DeviceName;
                //vc.RoomName = mESVideoInfo.RoomName;
                //vc.MESCallDelegate = new OnESCallDelegate(this);
                Shared.Application.currentVC.NavigationController.PushViewController(vc, true);
            }
            else if (interphoneType == InterphoneType.HDL.ToString())
@@ -188,7 +187,7 @@
            if (interphoneType == InterphoneType.IMOUVISIAL.ToString())
            {
                //乐橙可视对讲
                //1.初始化LCOpenSDK_Api
                //1.初始化LCOpenSDK_Api(Shared.IOS.LCVideoOnSDK)
                LCApiKit.SharedInstance().IsChinaMainland = GetIsChinaMainland();
                LCApiKit.SharedInstance().InitSDKOpenApi(mESVideoInfo.Lc_AccessToken);
                //2021-05-18 目前推送的PlayToken;有问题会导致SDK崩溃,暂时不传
@@ -226,6 +225,7 @@
            }
            else if (interphoneType == InterphoneType.FLVI.ToString())
            {
                //Shared.IOS.ESVideoOnSDK
                ESOnIntercomViewController vc = new ESOnIntercomViewController();
                vc.MESVideoID = mESVideoInfo.ESVideoUUID;
                vc.MESRoomID = roomID;
@@ -568,7 +568,7 @@
#if __IOS__
        #region OnESCallDelegate
        /////// <summary>
        /////// OnESCallDelegate 继承响应事件
        /////// OnESCallDelegate 继承响应事件(Shared.IOS.ESVideoOnSDK)
        /////// </summary>
        OnESCallDelegate mOnESCallDelegate;
@@ -644,7 +644,7 @@
        #region OnLCCallDelegate
        /////// <summary>
        /////// OnLCCallDelegate 继承响应事件
        /////// OnLCCallDelegate 继承响应事件(Shared.IOS.LCVideoOnSDK)
        /////// </summary>
        OnLCCallDelegate mOnLCCallDelegate;
@@ -712,7 +712,7 @@
        #endregion
#endif
        ///// <summary>
HDL_ON/DAL/ThirdPartySdk/HDLLinphone.cs
@@ -95,7 +95,7 @@
            Shared.IOS.HDLLinphoneSDK.HDLLinPhoneSDK.Instance().InitalLinPhone();
            //设置收到来电后、是否需自动跳转呼叫页面方案
            Shared.IOS.HDLLinphoneSDK.HDLLinPhoneSDK.Instance().IsAutoJumpCallView = IsAutoJumpCallView;
            //设置Listener监听
            //设置Listener监听(Shared.IOS.HDLLinphoneSDK)
            mOnHDLLinphoneCallDelegate = new OnHDLLinphoneCallDelegate(this);
            Console.WriteLine(UserInfo.Current.ID);
            Shared.IOS.HDLLinphoneSDK.HDLLinPhoneSDK.Instance().HdlLinphoneCallDelegate = mOnHDLLinphoneCallDelegate;
@@ -125,8 +125,7 @@
#if __IOS__
            //Shared.IOS.HDLLinphoneSDK.HDLLinPhoneSDK.Instance().Login("1003", "123456", "192.168.31.194:5060");
            //Shared.IOS.HDLLinphoneSDK.HDLLinPhoneSDK.Instance().Login("6666", "85521566", "116.62.26.215:5060");
            Shared.IOS.HDLLinphoneSDK.HDLLinPhoneSDK.Instance().Login(mHDLSipInfo.sipAccount, mHDLSipInfo.sipPasswd, mHDLSipInfo.realm);
#else
            if (mInterphoneType == InterphoneType.FREEVIEW.ToString())
@@ -163,7 +162,7 @@
            this.mHDLCallVideoInfo = null;
#if __IOS__
            HDLLinPhoneSDK.Instance().LogoutAllLinphoneUser();
            Shared.IOS.HDLLinphoneSDK.HDLLinPhoneSDK.Instance().LogoutAllLinphoneUser();
#else
            HDLLinphoneKit.Instance.Logout();
#endif
@@ -176,7 +175,7 @@
        {
#if __IOS__
            HDLLinPhoneSDK.Instance().ClearAllConfigs();
            Shared.IOS.HDLLinphoneSDK.HDLLinPhoneSDK.Instance().ClearAllConfigs();
#else
            HDLLinphoneKit.Instance.ClearProxyConfig();
#endif
@@ -427,7 +426,7 @@
#if __IOS__
            HDLLinPhoneSDK.Instance().CallWithUserName(mHDLCallVideoInfo.DeviceSipAccount, mHDLCallVideoInfo.DeviceName);
            Shared.IOS.HDLLinphoneSDK.HDLLinPhoneSDK.Instance().CallWithUserName(mHDLCallVideoInfo.DeviceSipAccount, mHDLCallVideoInfo.DeviceName);
#else
            //1.先呼叫设备
@@ -495,7 +494,7 @@
            {
#if __IOS__
                //自研可视对讲
                HDLLinPhoneSDK.Instance().GotoHDLSRLinphoneIntercomVC(mHDLCallVideoInfo.DeviceName,mHDLCallVideoInfo.DeviceSipAccount);
                Shared.IOS.HDLLinphoneSDK.HDLLinPhoneSDK.Instance().GotoHDLSRLinphoneIntercomVC(mHDLCallVideoInfo.DeviceName, mHDLCallVideoInfo.DeviceSipAccount);
#else
                var intent = new Intent(Shared.Application.Activity, typeof(Com.Hdl.Hdllinphonesdk.Activity.HDLLinphoneReverseCallActivity));  
                if (mHDLCallVideoInfo != null)
@@ -513,7 +512,7 @@
                if (IsAutoJumpCallView) return;
                //先结束掉之前的线程
                EndCheckIncomingCallThread();
                //检测是否来电了如果是直接调整呼叫页面如果不是则开启线程等待判断
                //检测是否来电了如果是直接调整呼叫页面如果不是则开启线程等待判断(Shared.IOS.HDLLinphoneSDK)
                if (IsIncomingReceivedCallState())
                {
                    Utlis.WriteLine("CALL 已经来电了。。。打开呼叫页面");
@@ -530,12 +529,13 @@
        }
        /// <summary>
        /// 是否来电状态
        /// 是否来电状态(Shared.IOS.HDLLinphoneSDK)
        /// </summary>
        /// <returns></returns>
        bool IsIncomingReceivedCallState() {
        bool IsIncomingReceivedCallState()
        {
#if __IOS__
             return HDLLinPhoneSDK.Instance().IsIncomingReceivedCallState;
            return Shared.IOS.HDLLinphoneSDK.HDLLinPhoneSDK.Instance().IsIncomingReceivedCallState;
#else
            return HDLLinphoneKit.Instance.IsIncomingReceivedCallState;
#endif
@@ -548,7 +548,7 @@
#if __IOS__
            HDLLinPhoneSDK.Instance().GotoHDLLinphoneIntercomVC(mHDLCallVideoInfo.DeviceName);
            Shared.IOS.HDLLinphoneSDK.HDLLinPhoneSDK.Instance().GotoHDLLinphoneIntercomVC(mHDLCallVideoInfo.DeviceName);
#else
            var intent = new Intent(Shared.Application.Activity, typeof(Com.Hdl.Hdllinphonesdk.Activity.HDLLinphoneIntercomActivity));
@@ -597,7 +597,7 @@
                                threadTime--;
                                Utlis.WriteLine("CALL 检测中...." + threadTime);
                                Thread.Sleep(1000);
                                //来电了,跳转呼叫页面
                                //来电了,跳转呼叫页面(Shared.IOS.HDLLinphoneSDK)
                                if (IsIncomingReceivedCallState())
                                {
                                    Utlis.WriteLine("CALL 来电了。。。打开呼叫页面");
@@ -649,10 +649,10 @@
            return checkIncomingCallThread == null || checkIncomingCallThread.ThreadState != ThreadState.Running;
        }
#endregion
        #endregion
#region ■  --  Android相关操作_______________________________
        #region ■  --  Android相关操作_______________________________
#if __Android__
@@ -747,23 +747,23 @@
        }
#endif
#endregion
        #endregion
#region ■  --  iOS相关操作_______________________________
        #region ■  --  iOS相关操作_______________________________
#if __IOS__
#region OnHDLLinphoneCallDelegate
        #region OnHDLLinphoneCallDelegate
        /// <summary>
        /// 
        /// </summary>
        OnHDLLinphoneCallDelegate mOnHDLLinphoneCallDelegate;
        /// <summary>
        /// 
        /// </summary>
        public class OnHDLLinphoneCallDelegate : HDLLinphoneCallDelegate
        {
        {
            [Weak] HDLLinphone hdlLinphone;
            public OnHDLLinphoneCallDelegate(HDLLinphone mHDLLinphone)
@@ -799,16 +799,16 @@
            /// <summary>
            /// 截图成功
            /// </summary>
            /// <param name="image"></param>
            //public override void OnScreenshotSuccessfulAction(UIImage image)
            //{
                ////NSData imageData = UIImagePNGRepresentation(image); UIImage
                //NSData imageData = image.AsPNG();
                //byte[] dataBytes = new byte[imageData.Length];
                //System.Runtime.InteropServices.Marshal.Copy(imageData.Bytes, dataBytes, 0, Convert.ToInt32(imageData.Length));
                ////image.g
                ////hdlLinphone.ScreenshotSuccessfulAction(dataBytes);
            //}
            /// <param name = "image" ></ param >
            public  void OnScreenshotSuccessfulAction(UIImage image)
            {
                //NSData imageData = UIImagePNGRepresentation(image); UIImage
                NSData imageData = image.AsPNG();
                byte[] dataBytes = new byte[imageData.Length];
                System.Runtime.InteropServices.Marshal.Copy(imageData.Bytes, dataBytes, 0, Convert.ToInt32(imageData.Length));
                //image.g
                //hdlLinphone.ScreenshotSuccessfulAction(dataBytes);
            }
            /// <summary>
            /// 开锁成功
@@ -825,15 +825,15 @@
            {
                Utlis.WriteLine("OnIncomingCall :" + userName);
            }
        }
#endregion
        #endregion
#endif
#endregion
        #endregion
    }
HDL_ON/Entity/DB_ResidenceData.cs
@@ -76,7 +76,9 @@
                                    ShowFunction.Sensor,ShowFunction.VideoIntercom,
                                    ShowFunction.SecurityCenter,ShowFunction.Acst,
                                    ShowFunction.MechanicalArm ,
                                    ShowFunction.SecurityMonitoring,};
                                    ShowFunction.SecurityMonitoring,
                                    ShowFunction.VideoDoorLock,
                    };
                }
                return dddd;
            }
HDL_ON/Entity/Enumerative/MyEnum.cs
@@ -185,6 +185,10 @@
        /// ip摄像头
        /// </summary>
        IpCam = 0x25,
        /// <summary>
        /// 萤石视频门锁
        /// </summary>
        VideoDoorLock = 0x26,
    }
HDL_ON/Entity/Function/Function.cs
@@ -1382,6 +1382,7 @@
        /// 门锁
        /// </summary>
        public const string DoorLock = "security.door";
        /// <summary>
        /// 门锁spk列表
        /// </summary>
@@ -1392,8 +1393,20 @@
            list.Add(DoorLock);
            return list;
        }
        /// <summary>
        /// 萤石视频门锁
        /// </summary>
        public const string VideoDoorLock="security.door.ezviz";
        /// <summary>
        /// 萤石视频门锁spk列表
        /// </summary>
        /// <returns></returns>
        public static List<string> GetVideoDoorLockSPKList()
        {
            var list = new List<string>();
            list.Add(VideoDoorLock);
            return list;
        }
        #region 灯光
        /// <summary>
HDL_ON/Entity/FunctionList.cs
@@ -159,6 +159,15 @@
            var spkList = SPK.GetDoorLockSPKList();
            return Functions.FindAll((obj) => spkList.Contains(obj.spk));
        }
        /// <summary>
        /// 获取萤石视频门锁
        /// </summary>
        /// <returns></returns>
        public List<Function> GetVideoDoorLockList()
        {
            var spkList = SPK.GetVideoDoorLockSPKList();
            return Functions.FindAll((obj) => spkList.Contains(obj.spk));
        }
        /// <summary>
        /// 新风列表
HDL_ON/Entity/ResponseEntity/ResidenceMemberInfo.cs
@@ -188,4 +188,26 @@
    //}
    /// <summary>
    /// 第三方注册信息
    /// </summary>
    public class extUserInfo
    {
        public string extUserId = "";
        public string extPlatform = "";
        public string homeId = "";
        public string extServerIp = "";
        public string extTenantCode = "";
        public string extUUID = "";
        public string extra = "";
    }
}
HDL_ON/Entity/Room.cs
@@ -568,5 +568,6 @@
            scenes.Remove(scenes.Find((obj) => obj.sid == scene.sid));
        }
    }
}
HDL_ON/HDL_ON.projitems
@@ -538,6 +538,12 @@
    <Compile Include="$(MSBuildThisFileDirectory)Entity\ResponseEntity\FreeviewMemberInfo.cs" />
    <Compile Include="$(MSBuildThisFileDirectory)UI\UI2\4-PersonalCenter\CombinedDimming\GroupChooseRoomPage.cs" />
    <Compile Include="$(MSBuildThisFileDirectory)UI\UI2\4-PersonalCenter\CombinedDimming\AddGroupControlPage.cs" />
    <Compile Include="$(MSBuildThisFileDirectory)UI\UI2\FuntionControlView\VideoDoorLock\VideDoorLockSend.cs" />
    <Compile Include="$(MSBuildThisFileDirectory)UI\UI2\FuntionControlView\VideoDoorLock\StackTraceLog.cs" />
    <Compile Include="$(MSBuildThisFileDirectory)UI\UI2\FuntionControlView\VideoDoorLock\ObjectClass.cs" />
    <Compile Include="$(MSBuildThisFileDirectory)UI\UI2\FuntionControlView\VideoDoorLock\CommonMethod.cs" />
    <Compile Include="$(MSBuildThisFileDirectory)UI\UI2\FuntionControlView\VideoDoorLock\VideoDoorLockPage.cs" />
    <Compile Include="$(MSBuildThisFileDirectory)UI\UI2\FuntionControlView\VideoDoorLock\VideoDoorLockListPage.cs" />
  </ItemGroup>
  <ItemGroup>
    <Folder Include="$(MSBuildThisFileDirectory)Entity\Device\" />
HDL_ON/UI/UI0-Public/PublicAssmeblyBLL.cs
@@ -3,6 +3,7 @@
using HDL_ON.DAL.Server;
using HDL_ON.Entity;
using Shared;
using static HDL_ON.UI.UI2.FuntionControlView.VideoDoorLock.CommonMethod;
namespace HDL_ON.UI
{
@@ -12,7 +13,7 @@
        /// <summary>
        /// 功能控制界面跳转事件
        /// </summary>
        public EventHandler<MouseEventArgs> LoadEvent_SkipFunctionControlPage(Function function, Button btnCollectionIcon, Button btnName, Button btnFromFloor
        public EventHandler<MouseEventArgs> LoadEvent_SkipFunctionControlPage(Function function, Button btnCollectionIcon, Button btnName, Button btnFromFloor, Comerom comerom,Action action
            )
        {
            EventHandler<MouseEventArgs> eventHandler = (sender, e) =>
@@ -235,7 +236,8 @@
                    case SPK.IpCam_Imou:
#if __IOS__
                        if (Shared.IOS.HDLCNVRSDK.HDLLCNVRSDK.SharedInstance().AccessToken==null) {//未初始化摄像头
                        if (Shared.IOS.HDLCNVRSDK.HDLLCNVRSDK.SharedInstance().AccessToken == null)
                        {//未初始化摄像头
                            Shared.IOS.HDLCNVRSDK.HDLLCNVRSDK.SharedInstance().InitSDKWithAppKey("HDL-HOME-APP-TEST", "WeJ8TY88vbakCcnvH8G1tDUqzLWY8yss", OnAppConfig.Instance.RequestHttpsHost);
                            Shared.IOS.HDLCNVRSDK.HDLLCNVRSDK.SharedInstance().AccessToken = UserInfo.Current.LoginTokenString;
                            Shared.IOS.HDLCNVRSDK.HDLLCNVRSDK.SharedInstance().RefreshToken = UserInfo.Current.RefreshToken;
@@ -244,8 +246,6 @@
                        }
                        //跳转大华摄像头
                        Shared.IOS.HDLCNVRSDK.HDLLCNVRSDK.SharedInstance().RefreshDeviceList();
                        //Shared.IOS.HDLCNVRSDK.HDLLCNVRSDK.SharedInstance().ToMonitorViewWithDeviceId(function.extDevId, function.name);
                        Shared.IOS.HDLCNVRSDK.HDLLCNVRSDK.SharedInstance().ToMonitorViewWithDeviceId(function.extDevId, function.name, Shared.Application.currentVC);
#else
                        FunctionList.List.GetIpCamImouList();
@@ -322,6 +322,14 @@
                        }
#endif
                        break;
                    case SPK.VideoDoorLock: {
                            //萤石视频门锁
                            var form = new VideoDoorLockPage(function, btnName, btnFromFloor,comerom,action);
                            MainPage.BasePageView.AddChidren(form);
                            MainPage.BasePageView.PageIndex = MainPage.BasePageView.ChildrenCount - 1;
                            form.Show();
                        }
                        break;
                }
            };
            return eventHandler;
HDL_ON/UI/UI0-Stan/Logic/HdlBluetoothAndroidLogic.cs
@@ -379,6 +379,8 @@
            }
        }
        /// <summary>
        /// 抄SDK的,我也不知道这个是什么
        /// </summary>
HDL_ON/UI/UI2/1-HomePage/HomePage.cs
@@ -725,6 +725,7 @@
            {
                int index = 0;
                var list = FunctionList.List.GetDeviceFunctionList();
                foreach (var function in list)
                {
                    //音乐模块有主从关系,需要特殊处理
@@ -1202,7 +1203,11 @@
                    btnIcon.UnSelectedImagePath = $"FunctionIcon/Icon/HomeIcon/{function.IconName}_blue.png";
                    btnIcon.SelectedImagePath = $"FunctionIcon/Icon/HomeIcon/{function.IconName}_blue.png";
                }
                else if (function.spk == SPK.VideoDoorLock)
                {
                    btnIcon.UnSelectedImagePath =UI2.FuntionControlView.VideoDoorLock.CommonMethod.Current.GetVideoDoorLockIcon(UI2.FuntionControlView.VideoDoorLock.CommonMethod.Comerom.collect);
                    //btnIcon.SelectedImagePath = $"FunctionIcon/Icon/HomeIcon/{function.IconName}_blue.png";
                }
                else
                {
                    Button btnSwitch;
@@ -1238,7 +1243,9 @@
                };
                var skipControlPageEvent = new PublicAssmebly().LoadEvent_SkipFunctionControlPage(function, btnCollection, btnName, btnZone);
                var skipControlPageEvent = new PublicAssmebly().LoadEvent_SkipFunctionControlPage(function, btnCollection, btnName, btnZone, UI2.FuntionControlView.VideoDoorLock.CommonMethod.Comerom.collect,()=> {
                    this.LoadDeviceFunctionControlZone();//删除设备后重新刷新UI
                });
                view.MouseUpEventHandler = skipControlPageEvent;
                btnName.MouseUpEventHandler = skipControlPageEvent;
                btnIcon.MouseUpEventHandler = skipControlPageEvent;
@@ -1452,11 +1459,14 @@
                LoadEvent_ControlScene(btnCoverd, btnName, btnZone, btnShowDelay, scene);
                btnSettingIcon.MouseUpEventHandler = (sender, e) => {
                    Action backAction = () => {
                btnSettingIcon.MouseUpEventHandler = (sender, e) =>
                {
                    Action backAction = () =>
                    {
                        //LoadSceneFunctionControlZone();
                    };
                    Action refreshAction = () => {
                    Action refreshAction = () =>
                    {
                        btnName.Text = scene.name;
                        btnZone.Text = scene.GetRoomListName();
                        //view.BackgroundImagePath = (scene as Scene).ImagePath;
@@ -1465,7 +1475,7 @@
                    };
                    var aep = new SceneEditPage(scene, backAction);
                    MainPage.BasePageView.AddChidren(aep);
                    aep.LoadPage( refreshAction);
                    aep.LoadPage(refreshAction);
                    MainPage.BasePageView.PageIndex = MainPage.BasePageView.ChildrenCount - 1;
                };
                //场景正在倒计时执行中
HDL_ON/UI/UI2/1-HomePage/MessageCenterPage.cs
@@ -832,6 +832,7 @@
            {
                if (bodyView != null)
                {
                    //Utlis.WriteLine("GetPushMessageAction M收到推送");
                    GetPushMessageList(showMesType);
                }
HDL_ON/UI/UI2/2-Classification/ClassificationPage.cs
@@ -5,6 +5,7 @@
using HDL_ON.Entity;
using HDL_ON.UI;
using HDL_ON.UI.CSS;
using HDL_ON.UI.UI2.FuntionControlView.VideoDoorLock;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using Shared;
@@ -605,21 +606,35 @@
            };
        }
        /// <summary>
        /// 加载功能列表界面
        /// </summary>
        void LoadFunctionPageView()
        void LoadFunctionPageView ()
        {
            #region
            functionsPageView = new VerticalScrolViewLayout()
            {
                BackgroundColor = CSS_Color.BackgroundColor,
                Height = Application.GetRealHeight(667 - 64 - 49 + 20),
            };
            contentPageView.AddChidren(functionsPageView);
            this.RefreshFunctionView();
            FrameLayout functionContentView;
        }
        FrameLayout functionContentView;
        /// <summary>
        /// 显示功能列表界面
        /// </summary>
        void RefreshFunctionView()
        {
            #region
            //functionsPageView = new VerticalScrolViewLayout()
            //{
            //    BackgroundColor = CSS_Color.BackgroundColor,
            //    Height = Application.GetRealHeight(667 - 64 - 49 + 20),
            //};
            //contentPageView.AddChidren(functionsPageView);
            //FrameLayout functionContentView;
            functionContentView = new FrameLayout()
            {
                Y = Application.GetRealHeight(16),
@@ -745,6 +760,14 @@
                        functionCount = FunctionList.List.GetAcstParentList().Count;
                        functionOnCount = FunctionList.List.GetAcstParentList().FindAll((obj) => obj.trait_on_off.curValue.ToString() == "on").Count;
                        break;
                    case ShowFunction.VideoDoorLock:
                        functionCount = FunctionList.List.GetVideoDoorLockList().Count;
#if DEBUG
                        //functionCount = 1;
#endif
                        functionOnCount = 1;
                        break;
                }
@@ -798,7 +821,7 @@
                    TextAlignment = TextAlignment.CenterLeft,
                    IsMoreLines = true,
                };
                functionView.AddChidren(btnName);
                functionView.AddChidren(btnName);
                if (item != ShowFunction.Environmental && item != ShowFunction.Sensor && item != ShowFunction.VideoIntercom
                    && item != ShowFunction.SecurityMonitoring && item != ShowFunction.FreshAir && item != ShowFunction.Music
@@ -1143,16 +1166,35 @@
                            MainPage.BasePageView.PageIndex = MainPage.BasePageView.ChildrenCount - 1;
                        };
                        break;
                    case ShowFunction.VideoDoorLock:
                        //萤石视频门锁
                        btnName.TextID = StringId.yingshishipinmensuo;
                        btnFunctionViewBg.MouseUpEventHandler = (sender, e) =>
                        {
                            var list =CommonMethod.Current.GetVideoDoorLockList();
                            var form = new VideoDoorLockListPage(()=> {
                                functionContentView?.RemoveFromParent();
                                this.RefreshFunctionView();
                            });
                            form.AddForm(list);
                        };
                        break;
                }
                //界面跳转--音乐跳转自己的界面--环境跳转自己的界面
                if (item != ShowFunction.Music && item != ShowFunction.Environmental && item != ShowFunction.SecurityMonitoring && item != ShowFunction.DoorLock
                    && ShowFunction.EnergyMonitoring != item && ShowFunction.VideoIntercom != item && ShowFunction.SecurityCenter != item
                //界面跳转--音乐跳转自己的界面--环境跳转自己的界面--(萤石视频门锁)跳转自己的界面
                if (item != ShowFunction.VideoDoorLock
                    && item != ShowFunction.Music
                    && item != ShowFunction.Environmental
                    && item != ShowFunction.SecurityMonitoring
                    && item != ShowFunction.DoorLock
                    && ShowFunction.EnergyMonitoring != item
                    && ShowFunction.VideoIntercom != item &&
                    ShowFunction.SecurityCenter != item
                    && ShowFunction.Acst != item)
                {
                    btnFunctionViewBg.MouseUpEventHandler = (sender, e) =>
                    {
                        var skipView = new FunctionPage();
                        MainPage.BasePageView.AddChidren(skipView);
                        skipView.LoadPage(functionPageTitleId);
@@ -1444,6 +1486,8 @@
            #endregion
        }
        void refreshInverterInfo(Button btnPowerTenerationToday, Button btnWorkingMode, Button btnCurrentPowerGeneration)
        {
            new System.Threading.Thread(() =>
HDL_ON/UI/UI2/2-Classification/FunctionControlZone.cs
@@ -38,12 +38,18 @@
        /// 是否在调光
        /// </summary>
        bool onDimmerBar;
        /// <summary>
        /// 删除设备后回调给界面刷新
        /// </summary>
        Action action;
        #endregion
        public FunctionControlZone(Function func)
        public FunctionControlZone(Function func,Action action)
        {
            bodyDiv = this;
            bodyDiv.Tag = func.sid;
            function = func;
            this.action = action;
        }
        public override void RemoveFromParent()
@@ -186,6 +192,10 @@
            {
                btnIcon.UnSelectedImagePath = "FunctionIcon/DoorLock/DoorLock.png";
            }
            else if (function.spk == SPK.VideoDoorLock)
            {
                btnIcon.UnSelectedImagePath = UI2.FuntionControlView.VideoDoorLock.CommonMethod.Current.GetVideoDoorLockIcon(UI2.FuntionControlView.VideoDoorLock.CommonMethod.Comerom.function);
            }
            else if (function.spk == SPK.HvacCac)
            {
                var btnHumidityIcon = new Button()
HDL_ON/UI/UI2/2-Classification/FunctionControlZoneBLL.cs
@@ -405,7 +405,7 @@
        /// </summary>
        void LoadEvent_DivSkipEvent()
        {
            var eventHandler = new PublicAssmebly().LoadEvent_SkipFunctionControlPage(function, btnCollectionIcon, btnName, btnFromFloor);
            var eventHandler = new PublicAssmebly().LoadEvent_SkipFunctionControlPage(function, btnCollectionIcon, btnName, btnFromFloor, UI2.FuntionControlView.VideoDoorLock.CommonMethod.Comerom.room,this.action);
            this.MouseUpEventHandler = eventHandler;
            btnName.MouseUpEventHandler = eventHandler;
            btnFromFloor.MouseUpEventHandler = eventHandler;
HDL_ON/UI/UI2/2-Classification/FunctionPage.cs
@@ -255,7 +255,7 @@
                            }
                            if (function.spk == SPK.LightRGBW || function.spk == SPK.LightRGB || function.spk == SPK.LightDimming)
                            {
                                var functionDiv = new FunctionControlZone(function)
                                var functionDiv = new FunctionControlZone(function,null)
                                {
                                    Gravity = Gravity.CenterHorizontal,
                                    Width = Application.GetRealWidth(343),
@@ -272,7 +272,7 @@
                            }
                            else if (function.spk == SPK.IpCam_Imou)
                            {
                                var functionDiv = new FunctionControlZone(function)
                                var functionDiv = new FunctionControlZone(function,null)
                                {
                                    Gravity = Gravity.CenterHorizontal,
                                    Width = Application.GetRealWidth(343),
@@ -289,7 +289,7 @@
                            }
                            else
                            {
                                var functionDiv = new FunctionControlZone(function)
                                var functionDiv = new FunctionControlZone(function,null)
                                {
                                    Gravity = Gravity.CenterHorizontal,
                                    Width = Application.GetRealWidth(343),
HDL_ON/UI/UI2/2-Classification/RoomPage.cs
@@ -53,6 +53,7 @@
            deleteAction = delAction;
            this.modifyImageAction = modifyImageAction;
        }
        /// <summary>
        /// 重载界面
        /// </summary>
@@ -65,22 +66,25 @@
            }
        }
        public void LoadPage()
        {
            bodyView.BackgroundColor = CSS_Color.BackgroundColor;
            new TopViewDiv(bodyView,room.roomName).LoadTopView_RoomTop(ReloadRoomName, skipEditPageAction);
            new TopViewDiv(bodyView, room.roomName).LoadTopView_RoomTop(ReloadRoomName, skipEditPageAction);
            functionListView = new VerticalScrolViewLayout()
            {
                Y = Application.GetRealHeight(64),
                Height = Application.GetRealHeight(603-12),
                Height = Application.GetRealHeight(603 - 12),
            };
            bodyView.AddChidren(functionListView);
            foreach (var function in room.GetRoomFunctions(false))
            var list = room.GetRoomFunctions(false);
            foreach (var function in list)
            {
                if (MainPage.RoomNotSupportFunctionList.Contains( function.spk))
                if (MainPage.RoomNotSupportFunctionList.Contains(function.spk))
                {
                    continue;
                }
@@ -89,7 +93,7 @@
                if (function.spk == SPK.LightRGB || function.spk == SPK.LightDimming)
                {
                    var functionDiv = new FunctionControlZone(function)
                    var functionDiv = new FunctionControlZone(function, null)
                    {
                        Gravity = Gravity.CenterHorizontal,
                        Width = Application.GetRealWidth(343),
@@ -105,7 +109,10 @@
                }
                else
                {
                    var functionDiv = new FunctionControlZone(function)
                    var functionDiv = new FunctionControlZone(function, () =>
                    {
                        this.ReLoadPage();
                    })
                    {
                        Gravity = Gravity.CenterHorizontal,
                        Width = Application.GetRealWidth(343),
@@ -132,7 +139,7 @@
                    BorderColor = 0x00FFFFFF,
                    BorderWidth = 1,
                    BackgroundColor = CSS_Color.MainBackgroundColor,
                    Tag = "Scene-" +  scene.sid
                    Tag = "Scene-" + scene.sid
                };
                functionListView.AddChidren(sceneRow);
                LoadSceneRow(sceneRow, scene);
@@ -147,7 +154,7 @@
        /// </summary>
        public void LoadSceneRow(FrameLayout bodyDiv, Scene scene)
        {
          var  btnIcon = new Button()
            var btnIcon = new Button()
            {
                X = Application.GetRealWidth(10),
                Y = Application.GetRealHeight(15),
@@ -214,15 +221,15 @@
                btnName.X = Application.GetRealWidth(52 + 16);
            }
            //加载场景控制事件
            LoadEvent_ControlScene(btnName,btnFromFloor,bodyDiv,scene );
            LoadEvent_ControlScene(btnName, btnFromFloor, bodyDiv, scene);
            LoadEvent_FunctionCollection(btnCollectionIcon,scene);
            LoadEvent_FunctionCollection(btnCollectionIcon, scene);
        }
        /// <summary>
        /// 加载功能收藏按钮事件
        /// </summary>
        void LoadEvent_FunctionCollection(Button btnCollectionIcon,Scene scene)
        void LoadEvent_FunctionCollection(Button btnCollectionIcon, Scene scene)
        {
            btnCollectionIcon.MouseUpEventHandler += (sender, e) =>
            {
@@ -233,9 +240,10 @@
        /// <summary>
        /// 加载场景控制事件
        /// </summary>
        void LoadEvent_ControlScene(Button btnName,Button btnFromFloor,FrameLayout bodyDiv, Scene scene)
        void LoadEvent_ControlScene(Button btnName, Button btnFromFloor, FrameLayout bodyDiv, Scene scene)
        {
            EventHandler<MouseEventArgs> upEvent = (sender, e) => {
            EventHandler<MouseEventArgs> upEvent = (sender, e) =>
            {
                DriverLayer.Control.Ins.ControlScene(scene);
                string msg = scene.name + Language.StringByID(StringId.AlreadyOpened);
                new PublicAssmebly().TipMsgAutoClose(msg, false);
@@ -245,5 +253,6 @@
            bodyDiv.MouseUpEventHandler = upEvent;
        }
    }
}
HDL_ON/UI/UI2/3-Intelligence/Automation/ConditionDeviceFunList.cs
@@ -619,7 +619,25 @@
                        }
                    }
                    break;
                //萤石视频门锁
                case SPK.VideoDoorLock:
                    {
                        LogicView.FunTypeView view1 = new LogicView.FunTypeView();
                        view1.btnText.TextID=StringId.yonghurenyuan;
                        view1.btnText.Name = Language.StringByID(StringId.shipinmensuo);
                        fLayout.AddChidren(view1.FLayoutView());
                        view1.btnClick.MouseUpEventHandler += (sender, e) =>
                        {
                            this.identifier = "open_door";//开锁事件
                            this.VideoDoorLockAction(this, device, view1.btnState);
                        };
                        if (edit)
                        {
                            this.GetEditState(device, index, view1.btnState,null, null, null);
                        }
                    }
                    break;
            }
            #region  保存
            ///保存View
@@ -669,6 +687,12 @@
                        //condition默认[]
                        inputDevice.condition = new List<Dictionary<string, string>>();
                    }
                }
                else if (device.spk == SPK.VideoDoorLock)
                {
                    ////萤石视频门锁
                    inputDevice.condition_type = "9";
                    inputDevice.identifier = this.identifier;
                }
@@ -1045,7 +1069,7 @@
            {
                try
                {
                   var faceIDList = Send.Current.GetListHomeFace(device.deviceId,true);
                    var faceIDList = Send.Current.GetListHomeFace(device.deviceId, true);
                    List<string> faceNameList = new List<string>();
                    for (int i = 0; i < faceIDList.Count; i++)
                    {
@@ -1070,6 +1094,65 @@
                    });
                }
                catch { }
                finally
                {
                    Application.RunOnMainThread(() =>
                    {
                        loading.Hide();
                    });
                }
            });
        }
        /// <summary>
        /// 萤石视频门锁专用
        /// </summary>
        /// <param name="frame">当前界面</param>
        /// <param name="device">当前设备</param>
        /// <param name="btnState">旧状态</param>
        public void VideoDoorLockAction(FrameLayout frame, Entity.Function device, Button btnState)
        {
            selectedState = device.spk + "_";
            Loading loading = new Loading();
            frame.AddChidren(loading);
            loading.Start();
            System.Threading.Tasks.Task.Run(() =>
            {
                try
                {
                    var userList =FuntionControlView.VideoDoorLock.VideDoorLockSend.Current.GetVideoDoorLockUserListInfo(device);
                    List<string> userNameList = new List<string>();
                    for (int i = 0; i < userList.Count; i++)
                    {
                        var user = userList[i];
                        userNameList.Add(user.extUserName);
                    }
                    Application.RunOnMainThread(() =>
                    {
                        loading.Hide();
                        PublicInterface publicInterface = new PublicInterface();//用户界面
                        publicInterface.FrameOrVv(this, userNameList, new List<string> { btnState.Text }, device.name, (index) =>
                        {
                            var userId = userNameList[index];
                            //界面显示选中值
                            btnState.Text = userId;
                            //数据封装
                            AddDictionary("open_user", userId, "string");
                        }, false);
                    });
                }
                catch { }
                finally
                {
                    Application.RunOnMainThread(() =>
                    {
                        loading.Hide();
                    });
                }
            });
HDL_ON/UI/UI2/3-Intelligence/Automation/InpOrOutLogicMethod.cs
@@ -407,6 +407,12 @@
                                        }
                                    }
                                    break;
                                case SPK.VideoDoorLock:
                                    {
                                        string value = this.GetValue(dicList);
                                        inputView.btnState.Text = value;
                                    }
                                    break;
                                case SPK.doorgate:
                                    {
                                        if (inputCondition.identifier == "door_call_cloud_event")
@@ -2131,6 +2137,15 @@
                        }
                    }
                    break;
                case SPK.VideoDoorLock:
                    {
                        foreach (var dic in dicList)
                        {
                            string value = dic["value"];
                            button1.Text = value;
                        }
                    }
                    break;
                case SPK.MusicStandard:
                case SPK.AvMusic:
                    {
HDL_ON/UI/UI2/3-Intelligence/Automation/LogicMethod.cs
@@ -187,7 +187,7 @@
            var list2 = this.GetVideoDeviceList();
            list.AddRange(list1);
            list.AddRange(list2);
            //GetTestDevice(ref list, true);
            GetTestDevice(ref list, true);
            return list;
        }
        /// <summary>
@@ -360,7 +360,8 @@
            {
                return "LogicIcon/sensor.png";
            }
            else if (SPK.DoorLock == device.spk)
            else if (SPK.DoorLock == device.spk
                || SPK.VideoDoorLock == device.spk)
            {
                return "FunctionIcon/DoorLock/DoorLock.png";
            }
@@ -519,7 +520,7 @@
                deviceStrTypeList.Add(Language.StringByID(StringId.Curtain));
            }
            ///空调类
            var ac = deviceList.Find((device) => device.spk == SPK.AcStandard || device.spk == SPK.AcIr || device.spk == SPK.HvacAC);
            var ac = deviceList.Find((device) => device.spk == SPK.AcStandard || device.spk == SPK.HvacAC|| device.spk == SPK.AcIr);
            if (ac != null)
            {
                deviceStrTypeList.Add(Language.StringByID(StringId.AC));
@@ -577,7 +578,8 @@
                deviceStrTypeList.Add(Language.StringByID(StringId.Electric));
            }
            ///门锁类
            var doorlock = deviceList.Find((device) => device.spk == SPK.DoorLock);
            var doorlock = deviceList.Find((device) => device.spk == SPK.DoorLock
            || device.spk == SPK.VideoDoorLock);
            if (doorlock != null)
            {
                deviceStrTypeList.Add(Language.StringByID(StringId.DoorLock));
@@ -698,6 +700,7 @@
            else if (deviceType == Language.StringByID(StringId.DoorLock))
            {
                functionTypeList.Add(SPK.DoorLock);
                functionTypeList.Add(SPK.VideoDoorLock);
            }
            ///音乐类
            else if (deviceType == Language.StringByID(StringId.Music))
@@ -776,6 +779,8 @@
                functionTypeList.Add(SPK.MechanicalArm);
                functionTypeList.Add(SPK.IpCam_Imou);
                functionTypeList.Add(SPK.SensorPm10);
                functionTypeList.Add(SPK.VideoDoorLock);
                functionTypeList.Add(SPK.AcIr);
            }
@@ -835,6 +840,8 @@
                        deviceTypeList.Add(SPK.doorgate);
                        deviceTypeList.Add(SPK.IpCam_Imou);
                        deviceTypeList.Add(SPK.SensorPm10);
                        deviceTypeList.Add(SPK.VideoDoorLock);
                        deviceTypeList.Add(SPK.AcIr);
                    }
                    break;
@@ -858,6 +865,7 @@
                        deviceTypeList.Add(SPK.MusicStandard);
                        deviceTypeList.Add(SPK.AvMusic);
                        deviceTypeList.Add(SPK.MechanicalArm);
                        deviceTypeList.Add(SPK.AcIr);
                    }
                    break;
            }
@@ -1176,9 +1184,9 @@
                 //new Entity.Function { sid = "1234567890", name = "超声波传感器", spk = Entity.SPK.SensorUtrasonic },
                 // new Entity.Function { sid = "1234567891", name = "温度传感器", spk = Entity.SPK.SensorTemperature },
                 //  new Entity.Function { sid = "1234567892", name = "湿度传感器", spk = Entity.SPK.SensorHumidity },
                    new Entity.Function { sid = "12345678933456", name = "调光灯", spk = Entity.SPK.LightDimming },
                      new Entity.Function { sid = "1234567895444", name = "面板", spk = Entity.SPK.PanelSocket },
                      new Entity.Function { sid = "12345678968888", name = "pm10", spk = Entity.SPK.SensorPm10 },
                    new Entity.Function { sid = "12345678933456", name = "门锁", spk = Entity.SPK.DoorLock },
                      new Entity.Function { sid = "1234567895444", name = "视频门锁", spk = Entity.SPK.VideoDoorLock },
                      //new Entity.Function { sid = "12345678968888", name = "pm10", spk = Entity.SPK.SensorPm10 },
                      //  new Entity.Function { sid = "1234567897", name = "毫米波传感器1", spk = Entity.SPK.SenesorMegahealth2 },
                      // new Entity.Function { sid = "1234567899", name = "门磁传感器", spk = Entity.SPK.SensorDoorWindow },
                      //  new Entity.Function { sid = "12345678991234", name = "HDL机械手", spk = Entity.SPK.MechanicalArm },
HDL_ON/UI/UI2/3-Intelligence/Automation/Send.cs
@@ -462,6 +462,38 @@
        }
        /// <summary>
        /// 获取住宅已录入人脸信息
        /// </summary>
        /// <param name="deviceId">可视对讲设备id</param>
        /// <returns></returns>
        public List<Face> GetHomeFaceList(string deviceId, bool isTip)
        {
            var jObject = new JObject();
            jObject.Add("homeId", LogicMethod.Current.HomeId);
            jObject.Add("deviceId", deviceId);
            var responsePackNew = RequestServerhomeId(jObject, NewAPI.Api_Post_GetListHomeFace, "获取住宅已录入人脸信息");
            //如果是token过期则刷新token
            if (responsePackNew.Code == StateCode.TOKEN_EXPIRED)
            {
                RefreshToken();
                GetListHomeFace(deviceId, isTip);
            }
            if (Check(responsePackNew, isTip) == false)
            {
                return new List<Face>();
            }
            var list = Newtonsoft.Json.JsonConvert.DeserializeObject<List<Face>>(responsePackNew.Data.ToString());
            if (list == null)
            {
                list = new List<Face>();
            }
            faceList.Clear();
            faceList.AddRange(list);
            return list;
        }
        /// <summary>
        ///请求服务器(与住宅有关:例如;homeId) 
        /// </summary>
HDL_ON/UI/UI2/3-Intelligence/Automation/TimeTpye.cs
@@ -92,11 +92,12 @@
            //日出/日落/正午点击事件
            timeSpecialView.btnClick.MouseUpEventHandler += (sen, e) =>
            {
                if (string.IsNullOrEmpty( Entity.DB_ResidenceData.Instance.CurrentRegion.homeAddress))//.longitude == 0 && Entity.DB_ResidenceData.Instance.CurrentRegion.latitude == 0)
                {
                    new PublicAssmebly().TipMsg(StringId.tip, StringId.GatewayLocationInformationIsNotConfigured);
                    return;
                }
                //if (string.IsNullOrEmpty( Entity.DB_ResidenceData.Instance.CurrentRegion.homeAddress))//.longitude == 0 && Entity.DB_ResidenceData.Instance.CurrentRegion.latitude == 0)
                //{
                //    new PublicAssmebly().TipMsg(StringId.tip, StringId.GatewayLocationInformationIsNotConfigured);
                //    return;
                //}
                SpeciaTime speciaTime = new SpeciaTime();
                MainPage.BasePageView.AddChidren(speciaTime);
                speciaTime.Show();
HDL_ON/UI/UI2/4-PersonalCenter/AddFunction/AddDevciePage.cs
@@ -19,6 +19,7 @@
#if __ANDROID__
    public class dddxx { }
#else
        //大华摄像头sdk代理(Shared.IOS.HDLCNVRSDK)
        hdlLCNVRSDKDelegate hdlLCNVRDelegate;
        public class hdlLCNVRSDKDelegate : HDLLCNVRSDKDelegate
        {
@@ -193,7 +194,7 @@
                            Shared.IOS.HDLCNVRSDK.HDLLCNVRSDK.SharedInstance().AccessToken = UserInfo.Current.LoginTokenString;
                            Shared.IOS.HDLCNVRSDK.HDLLCNVRSDK.SharedInstance().RefreshToken = UserInfo.Current.RefreshToken;
                            Shared.IOS.HDLCNVRSDK.HDLLCNVRSDK.SharedInstance().HomeId = DB_ResidenceData.Instance.CurrentRegion.id;
                            //跳转添加摄像头
                            //跳转添加摄像头(Shared.IOS.HDLCNVRSDK)
                            hdlLCNVRDelegate = new hdlLCNVRSDKDelegate(() =>
                            {//添加成功返回事件
                                refreshView.BeginHeaderRefreshing();
@@ -421,6 +422,11 @@
                                this.RemoveFromParent();
                            };
                            break;
                        case SPK.VideoDoorLock: {
                                //跳转到android那边去
                                HDL_ON.UI.UI2.FuntionControlView.VideoDoorLock.CommonMethod.Current.SkipAddDeviceActivity(SPK.VideoDoorLock);
                            }
                            break;
                    }
                };
            }
HDL_ON/UI/UI2/4-PersonalCenter/AddFunction/DeviceListPage.cs
@@ -11,7 +11,7 @@
using Shared;
namespace HDL_ON.UI
{
    public class DeviceListPage  : FrameLayout
    public class DeviceListPage : FrameLayout
    {
        FrameLayout bodyView;
        VerticalRefreshLayout contentView;
@@ -59,7 +59,8 @@
        {
            var waitPage = new Loading();
            waitPage.Start();
            new System.Threading.Thread(() => {
            new System.Threading.Thread(() =>
            {
                try
                {
                    var pm = new HttpServerRequest();
@@ -77,7 +78,7 @@
                            }
                            else
                            {
                                var tipView = new EmptyTipView(Language.StringByID(StringId.NotAddedAnyDevices),160)
                                var tipView = new EmptyTipView(Language.StringByID(StringId.NotAddedAnyDevices), 160)
                                {
                                    Gravity = Gravity.CenterHorizontal,
                                };
@@ -96,7 +97,8 @@
                }
                finally
                {
                    Application.RunOnMainThread(() => {
                    Application.RunOnMainThread(() =>
                    {
                        if (waitPage != null)
                        {
                            waitPage.RemoveFromParent();
@@ -113,6 +115,10 @@
            bool isFrist = true;
            foreach (var device in deviceList)
            {
                if (!this.CheckSupportDevice(device))
                {
                    continue;
                }
                var row = new RowLayout()
                {
                    Height = Application.GetRealHeight(50),
@@ -168,7 +174,8 @@
                };
                row.AddChidren(btnName);
                btnName.MouseUpEventHandler = (sender, e) => {
                btnName.MouseUpEventHandler = (sender, e) =>
                {
                    switch (device.spk)
                    {
                        case SPK.IrModule:
@@ -187,7 +194,8 @@
                                contentView.BeginHeaderRefreshing();
                            };
                            break;
                        case SPK.SensorEnvironment:case SPK.SensorEnvironmentHailin:
                        case SPK.SensorEnvironment:
                        case SPK.SensorEnvironmentHailin:
                        case SPK.SensorEnvironment2:
                        case SPK.SensorEnvironment3:
                            var smPage1 = new SensorEnvironmentManagerPage();
@@ -267,7 +275,8 @@
                        Width = Application.GetRealWidth(150),
                    };
                    row.AddChidren(btnEdit);
                    btnEdit.MouseUpEventHandler = (sender, e) =>{
                    btnEdit.MouseUpEventHandler = (sender, e) =>
                    {
                        Action<string> callBack = (str) =>
                        {
                            if (string.IsNullOrEmpty(str))
@@ -337,6 +346,23 @@
        }
        /// <summary>
        /// 检查是否支持
        /// </summary>
        /// <param name="function"></param>
        /// <returns></returns>
        bool CheckSupportDevice(Function function)
        {
            if (function == null) return false;
            if (function.spk == SPK.VideoDoorLock)
            {
                return false;
            }
            return true;
        }
    }
HDL_ON/UI/UI2/4-PersonalCenter/PersonalCenterPageBLL.cs
@@ -226,6 +226,7 @@
                            dialog.Close();
                            LoadEvent_ChangeCurHome(home);
                            LoadContentView();
                            HDL_ON.UI.UI2.FuntionControlView.VideoDoorLock.CommonMethod.Current.ChangeCurrHome(home);
                        };
                    }
                    dialog.Show();
@@ -415,6 +416,7 @@
                    dialog.Close();
                    LoadEvent_ChangeCurHome(home);
                    LoadContentView();
                    HDL_ON.UI.UI2.FuntionControlView.VideoDoorLock.CommonMethod.Current.ChangeCurrHome(home);
                };
            }
HDL_ON/UI/UI2/4-PersonalCenter/PersonalDataPage.cs
@@ -828,6 +828,7 @@
                MainPage.BasePageView.AddChidren(myServerInfoPage);
                myServerInfoPage.LoadPage();
                MainPage.BasePageView.PageIndex = MainPage.BasePageView.ChildrenCount - 1;
            };
            myServerInfoCellView.GoAction = selectAction;
            myServerInfoCellView.BtnTilte.Text = Language.StringByID(StringId.ServerInformation);
HDL_ON/UI/UI2/4-PersonalCenter/PersonalDataPageBLL.cs
@@ -4,6 +4,11 @@
using HDL_ON.Entity;
using Shared;
#if __IOS__
using UIKit;
using Foundation;
#endif
namespace HDL_ON.UI
{
    public partial class PersonalDataPage
@@ -439,7 +444,6 @@
                MainPage.BasePageView.AddChidren(aep);
                aep.LoadPage();
                MainPage.BasePageView.PageIndex = MainPage.BasePageView.ChildrenCount - 1;
            };
            _QRcodeView.MouseUpEventHandler = eventHandler;
            btnQRcode.MouseUpEventHandler = eventHandler;
@@ -447,7 +451,7 @@
            btnQRcodeRight.MouseUpEventHandler = eventHandler;
        }
        #region 修改绑定邮箱
#region 修改绑定邮箱
        /// <summary>
        /// 修改绑定邮箱
        /// </summary>
@@ -459,6 +463,7 @@
                {
                    btnUserEmailInfo.Text = GetBindAccountText(email);
                };
                if (CheckIfUnbound(btnUserEmailInfo.Text))
@@ -493,6 +498,7 @@
                Action<string> action = (phone) =>
                {
                    btnUserPhoneInfo.Text = GetBindAccountText(phone);
                };
                if (CheckIfUnbound(btnUserPhoneInfo.Text))
@@ -511,15 +517,14 @@
                    MainPage.BasePageView.PageIndex = MainPage.BasePageView.ChildrenCount - 1;
                }
            };
            btnUserPhoneInfo.MouseUpEventHandler = eventHandler;
            btnUserPhoneRight.MouseUpEventHandler = eventHandler;
            userPhoneInfoView.MouseUpEventHandler = eventHandler;
        }
        #endregion
#endregion
        #region 解锁设置区域
#region 解锁设置区域
        //void LoadEvent_SkipInterpretationSettings()
        //{
        //    EventHandler<MouseEventArgs> eventHandler = (sender, e) =>
@@ -535,7 +540,7 @@
        //    btnInterpretationSettingsTip.MouseUpEventHandler = eventHandler;
        //}
        #endregion
#endregion
        /// <summary>
        /// 跳转修改密码界面
HDL_ON/UI/UI2/4-PersonalCenter/PirDevice/PirSend.cs
@@ -291,10 +291,10 @@
        /// <returns></returns>
        public static ResponsePackNew RequestServerhomeId(object o, string api_Url, int mTimeout = 20)
        {
            MainPage.Log("红外宝请求数据:"+api_Url+"\r\n"+o.ToString());
            MainPage.Log("红外宝->发送数据:"+api_Url+"\r\n"+o.ToString());
            var requestJson = HttpUtil.GetSignRequestJson(o);
            var responsePackNew=  HttpUtil.RequestHttpsPostFroHome(api_Url, requestJson, mTimeout);
            MainPage.Log("回复红外宝请求数据:" + "\r\n"+ Newtonsoft.Json.JsonConvert.SerializeObject(responsePackNew));
            MainPage.Log("红外宝->回复数据:" + "\r\n"+ Newtonsoft.Json.JsonConvert.SerializeObject(responsePackNew));
            return responsePackNew;
        }
HDL_ON/UI/UI2/FuntionControlView/FunctionBaseInfoSetPage.cs
@@ -29,6 +29,18 @@
        /// 位置信息跳转编辑按钮
        /// </summary>
        Button btnLocationInfoRight;
        /// <summary>
        /// 删除设备
        /// </summary>
        Button delTextBtn;
        /// <summary>
        /// 下一级图标
        /// </summary>
        Button delRightBtn;
        /// <summary>
        /// 删除设备行FrameLayout
        /// </summary>
        FrameLayout delView;
        #endregion
@@ -38,6 +50,11 @@
        /// 后退时,刷新之前界面的显示信息
        /// </summary>
        Action actionRefresh;
        /// <summary>
        /// 解绑设备回调
        /// </summary>
        public Action actionDel;
        #endregion
        public FunctionBaseInfoSetPage(Function func, Action action)
@@ -180,13 +197,13 @@
                #endregion
            }
            #region 共享
            //var sharedView = new FrameLayout()
            //{
            //    Height = Application.GetRealHeight(55),
            //    BackgroundColor = CSS_Color.MainBackgroundColor,
            //};
            //contentView.AddChidren(sharedView);
            //var btnSharedText = new Button()
            //{
            //    X = Application.GetRealWidth(16),
@@ -219,6 +236,50 @@
            //    });
            #endregion
            #region 删除设备行
            delView = new FrameLayout()
            {
                Height = Application.GetRealHeight(55),
                BackgroundColor = CSS_Color.MainBackgroundColor,
            };
            if (this.function.spk == SPK.VideoDoorLock)
            {
                contentView.AddChidren(delView);
            }
            var lineBtn = new Button()
            {
                Gravity = Gravity.CenterHorizontal,
                BackgroundColor = CSS_Color.DividingLineColor,
                Width = Application.GetRealWidth(343),
                Height = Application.GetRealHeight(1)
            };
            delView.AddChidren(lineBtn);
             delTextBtn = new Button()
            {
                X = Application.GetRealWidth(16),
                Width = Application.GetRealWidth(160),
                TextAlignment = TextAlignment.CenterLeft,
                TextColor = CSS_Color.FirstLevelTitleColor,
                TextSize = CSS_FontSize.SubheadingFontSize,
                TextID = StringId.DeleteDevice,
            };
            delView.AddChidren(delTextBtn);
            delRightBtn= new Button()
            {
                X = Application.GetRealWidth(339),
                Gravity = Gravity.CenterVertical,
                Width = Application.GetMinRealAverage(16),
                Height = Application.GetMinRealAverage(16),
                UnSelectedImagePath = "Public/RightIcon.png",
            };
            delView.AddChidren(delRightBtn);
            #endregion
#if stage2
            #region 添加到桌面
            var addToDesktopView = new FrameLayout()
HDL_ON/UI/UI2/FuntionControlView/FunctionBaseInfoSetPageBLL.cs
@@ -12,6 +12,8 @@
        {
            LoadEvent_ChangeFunctionName ();
            SkipChooseRoomPage();
            DelDeviceEvent();
        }
        /// <summary>
@@ -77,5 +79,45 @@
            }
                
        }
        /// <summary>
        /// 解绑设备的事件
        /// </summary>
        void DelDeviceEvent()
        {
            EventHandler<MouseEventArgs> ClickEvent = (sener, e) =>
            {
                new HDL_ON.UI.Music.View.TipView().TipBox(-1, StringId.AreYouSureToDeleteThisDevice, () =>
                {
                    UI2.FuntionControlView.VideoDoorLock.VideDoorLockSend.Current.DelDevice(this.function, (isBool) =>
                    {
                        Application.RunOnMainThread(() =>
                        {
                            if (!isBool)
                            {
                                new Tip()
                                {
                                    CloseTime = 1,
                                    Text = Language.StringByID(StringId.delFail),
                                    Direction = AMPopTipDirection.None,
                                }.Show(bodyView);
                                return;
                            }
                            //删除本地文件
                            UI2.FuntionControlView.VideoDoorLock.CommonMethod.Current.DeleteFunction(this.function);
                            this.RemoveFromParent();
                            this.actionDel?.Invoke();
                        });
                    });
                });
            };
            this.delView.MouseUpEventHandler += ClickEvent;
            this.delTextBtn.MouseUpEventHandler += ClickEvent;
            this.delRightBtn.MouseUpEventHandler += ClickEvent;
        }
    }
}
HDL_ON/UI/UI2/FuntionControlView/Music/SendMethod.cs
@@ -86,7 +86,7 @@
                d.Add("homeId", DB_ResidenceData.Instance.CurrentRegion.id);
                d.Add("deviceIds", functionIds);
                var responsePackNew = RequestServerhomeId(d, NewAPI.Api_Post_RefreshDeviceStatus, "刷新设备状态");
                if (!this.dataChecking(responsePackNew))
                if (!this.DataChecking(responsePackNew))
                {
                    return;
                }
@@ -123,7 +123,7 @@
                d.Add("homeId", DB_ResidenceData.Instance.CurrentRegion.id);
                d.Add("deviceIds", new List<string> { music.deviceId });
                var responsePackNew = RequestServerhomeId(d, NewAPI.Api_Post_PlayerList, "获取音乐列表");
                if (!this.dataChecking(responsePackNew))
                if (!this.DataChecking(responsePackNew))
                {
                    return;
                }
@@ -173,7 +173,7 @@
                }
                d.Add("deviceInfos", new List<Dictionary<string, object>> { deviceIds });
                var responsePackNew = RequestServerhomeId(d, NewAPI.Api_Post_GroupList, "获取列表名列表");
                if (!this.dataChecking(responsePackNew))
                if (!this.DataChecking(responsePackNew))
                {
                    return new List<GroupList>();
                }
@@ -238,7 +238,7 @@
                d.Add("sidGroups", new List<Dictionary<string, object>> { d1 });
                var responsePackNew = RequestServerhomeId(d, NewAPI.Api_Post_GroupPlayerList, "通过列表名获取歌曲列表");
                if (!this.dataChecking(responsePackNew))
                if (!this.DataChecking(responsePackNew))
                {
                    return new List<PalyerSongListInfo>();
                }
@@ -282,10 +282,11 @@
        /// </summary>
        /// <param name="responsePackNew">回复数据对象</param>
        /// <returns></returns>
        private bool dataChecking(ResponsePackNew responsePackNew)
        private bool DataChecking(ResponsePackNew responsePackNew)
        {
            if (responsePackNew.Code != "0" || responsePackNew.Data == null || responsePackNew.Data.ToString() == "")
            if (responsePackNew.Data == null||responsePackNew.Code != "0"  || responsePackNew.Data.ToString() == "")
            {
                return false;
            }
            return true;
HDL_ON/UI/UI2/FuntionControlView/Music/View/SizeClass.cs
@@ -1,93 +1,94 @@
using System;
namespace HDL_ON.UI.Music
{
    public static class TextSize
    public class TextSize
    {
        public static int TopLine = 1;
        public static int MiddleLine =1;
        public static int DownLine = 1;
        public const int TopLine = 1;
        public const int MiddleLine = 1;
        public const int DownLine = 1;
        public static int Text24 = 24;
        public static int Text20 = 20;
        public static int Text18 = 18;
        public static int Text16 = 16;
        public static int Text14 = 14;
        public static int Text12 = 12;
        public static int Text10 = 10;
        public const int Text24 = 24;
        public const int Text20 = 20;
        public const int Text18 = 18;
        public const int Text16 = 16;
        public const int Text14 = 14;
        public const int Text12 = 12;
        public const int Text10 = 10;
    }
    public static class MusicColor
    public class MusicColor
    {
        /// <summary>
        /// 顶部背景颜色
        /// </summary>
        public static uint TopViewColor = 0xFFF7F7F7;
        public const uint TopViewColor = 0xFFF7F7F7;
        /// <summary>
        /// 界面背景颜色
        /// </summary>
        public static uint ViewColor = 0xFFF2F3F7;
        public const uint ViewColor = 0xFFF2F3F7;
        /// <summary>
        /// 白色背景颜色
        /// </summary>
        public static uint WhiteColor = 0xFFFFFFFF;
        public const uint WhiteColor = 0xFFFFFFFF;
        /// <summary>
        /// 红色背景颜色
        /// </summary>
        public static uint RedColor = 0xFFFF4747;
        /// <summary>
        /// 线条颜色
        /// </summary>
        public static uint LineColor =0xFFECEDEE;
        /// <summary>
        /// 弹窗背景颜色
        /// </summary>
        public static uint PopupBackgroundColor = 0x90000000;
        public const uint RedColor = 0xFFFF4747;
        /// <summary>
        /// 线条颜色
        /// </summary>
        public static uint MusicEditColor = 0xFFFC9C04;
        public const uint LineColor = 0xFFECEDEE;
        /// <summary>
        /// 弹窗背景颜色
        /// </summary>
        public static uint MusicDelColor = 0xFFFF7474;
        public const uint PopupBackgroundColor = 0x90000000;
        public static uint Text18Color = 0xFF1B2D4D;
        public static uint MusicTxet14SelectedColor = 0xFF4484F4;
        public static uint MusicTxet14Color = 0xFF1B2D4D;
        public static uint MusicTxet12SelectedColor = 0xFF4484F4;
        public static uint MusicNoTxetColor = 0xFFC0C7D4;
        public static uint TextColor = 0xFF1B2D4D;
        public static uint SelectedColor = 0xFF4484F4;
        /// <summary>
        /// 线条颜色
        /// </summary>
        public const uint MusicEditColor = 0xFFFC9C04;
        /// <summary>
        /// 弹窗背景颜色
        /// </summary>
        public const uint MusicDelColor = 0xFFFF7474;
        public static uint TextTimeColor = 0xFF798394;
        public const uint Text18Color = 0xFF1B2D4D;
        public const uint MusicTxet14SelectedColor = 0xFF4484F4;
        public const uint MusicTxet14Color = 0xFF1B2D4D;
        public const uint MusicTxet12SelectedColor = 0xFF4484F4;
        public static uint TextCancelColor = 0xFF798394;
        public const uint MusicNoTxetColor = 0xFFC0C7D4;
        public const uint TextColor = 0xFF1B2D4D;
        public const uint SelectedColor = 0xFF4484F4;
        public const uint TextTimeColor = 0xFF798394;
        public const uint TextCancelColor = 0xFF798394;
    }
    public static class H_W {
    public class H_W
    {
        /// <summary>
        /// app高度
        /// </summary>
        public static int H = 667;
        public const int H = 667;
        /// <summary>
        /// app宽度
        /// </summary>
        public static int W = 375;
        public const int W = 375;
        /// <summary>
        /// 顶部高度
        /// </summary>
        public static int T_Height = 64;
        public const int T_Height = 64;
        /// <summary>
        /// 线高度
        /// </summary>
        public static int Line = 1;
        public const int Line = 1;
    }
HDL_ON/UI/UI2/FuntionControlView/Video/View/ShowDialog.cs
@@ -1,23 +1,49 @@
using System;
using HDL_ON.UI.CSS;
using HDL_ON.UI.Music;
using Shared;
namespace HDL_ON.UI.UI2.FuntionControlView.Video.View
{
    public class ShowDialog
    {
        private static ShowDialog showDialog;
        public static ShowDialog Currnet
        {
            get
            {
                if (showDialog == null)
                {
                    showDialog = new ShowDialog();
                }
                return showDialog;
            }
        }
        public Dialog dialog;
        /// <summary>
        /// 
        /// </summary>
        /// <param name="title">标题</param>
        /// <param name="action1">回调函数</param>
        /// <param name="action2">回调函数</param>
        public void ClickBox(string title, Action<Dialog> action1, Action<Dialog> action2)
        /// <param name="jieTingAction">回调函数</param>
        /// <param name="guanBiAction">回调函数</param>
        public void ClickBox(string title, Action<Dialog> jieTingAction, Action<Dialog> guanBiAction)
        {
            Dialog dialog = new Dialog()
            if (dialog != null)
            {
                //防止二重界面
                dialog.Close();
            }
            dialog = new Dialog()
            {
                BackgroundColor = MusicColor.PopupBackgroundColor,
            };
            FrameLayout whiteView = new FrameLayout()
            {
                X = Application.GetRealWidth(56),
@@ -50,7 +76,7 @@
                TextColor = MusicColor.TextColor,
                TextSize = TextSize.Text16,
                TextAlignment = TextAlignment.CenterLeft,
                Text = "来自“围墙机”呼叫",
                Text = title,
            };
            whiteView.AddChidren(btnTitle);
@@ -77,14 +103,135 @@
            guaduanIconBtn.MouseUpEventHandler += (sender, e) =>
            {
                action1(dialog);
                guanBiAction(dialog);
            };
            jietingIconBtn.MouseUpEventHandler += (sender, e) =>
            {
                action2(dialog);
                jieTingAction(dialog);
            };
        }
        /// <summary>
        /// 初始化Dialog
        /// </summary>
        /// <param name="titleStr">标题</param>
        /// <param name="msgStr">提示信息</param>
        /// <param name="okAction"></param>
        /// <param name="cancelAction"></param>
        /// <param name="cancelID"></param>
        /// <param name="confirmID"></param>
        public void ShowDialogBase(string titleStr, string msgStr, Action okAction, Action cancelAction, int cancelID = StringId.Cancel, int confirmID = StringId.Confirm, bool isAlarmColor = false)
        {
            if (dialog != null)
            {
                //防止二重界面
                dialog.Close();
            }
            dialog = new Dialog()
            {
                BackgroundColor = MusicColor.PopupBackgroundColor,
            };
            var bodyView = new FrameLayout();
            dialog.AddChidren(bodyView);
            FrameLayout contentView = new FrameLayout()
            {
                Gravity = Gravity.Center,
                Width = Application.GetRealWidth(270),
                Height = Application.GetRealHeight(140),
                BackgroundColor = CSS_Color.MainBackgroundColor,
                BorderColor = 0x00000000,
                BorderWidth = 0,
                Radius = (uint)Application.GetMinRealAverage(10),
            };
            bodyView.AddChidren(contentView);
            Button btnTitle = new Button()
            {
                Y = Application.GetRealHeight(20),
                Height = Application.GetRealHeight(22),
                TextColor = CSS_Color.MainColor,
                TextSize = CSS_FontSize.SubheadingFontSize,
                TextAlignment = TextAlignment.Center,
                IsBold = true,
                Text = titleStr,
            };
            contentView.AddChidren(btnTitle);
            int Width135 = Application.GetRealWidth(135);
            //提示内容按钮
            Button btnMsg = new Button()
            {
                Y = btnTitle.Bottom + Application.GetRealHeight(4),
                X = Application.GetRealWidth(6),
                Height = Application.GetRealHeight(46),
                Width = Application.GetRealWidth(258),
                TextAlignment = TextAlignment.Center,
                TextColor = CSS_Color.TextualColor,
                TextSize = CSS_FontSize.PromptFontSize_FirstLevel,
                Text = msgStr,
                IsMoreLines = true,
            };
            contentView.AddChidren(btnMsg);
            Button btnLine = new Button()
            {
                Y = Application.GetRealHeight(96),
                Height = Application.GetRealHeight(1),
                Width = Application.GetRealWidth(270 / 2),
                BackgroundColor = CSS_Color.DividingLineColor,
            };
            contentView.AddChidren(btnLine);
            Button btnCancel = new Button()
            {
                Y = btnLine.Bottom,
                Width = Width135,
                Height = Application.GetRealHeight(43),
                TextAlignment = TextAlignment.Center,
                TextColor = CSS_Color.TextualColor,
                TextSize = CSS_FontSize.SubheadingFontSize,
                TextID = cancelID,
            };
            contentView.AddChidren(btnCancel);
            Button btnConfirm = new Button()
            {
                X = contentView.Width - Width135,
                Y = btnLine.Y,
                Width = Width135,
                Height = Application.GetRealHeight(45),
                TextAlignment = TextAlignment.Center,
                //TextColor = CSS_Color.TextualColor,
                TextSize = CSS_FontSize.SubheadingFontSize,
                TextColor = CSS_Color.MainBackgroundColor,
                BackgroundColor = CSS_Color.MainColor,
                TextID = confirmID,
            };
            contentView.AddChidren(btnConfirm);
            //例:右下圆角 大小为50
            int mRectCornerID = HDLUtils.RectCornerBottomRight;
            btnConfirm.SetCornerWithSameRadius((uint)Application.GetMinRealAverage(10), mRectCornerID);
            btnCancel.MouseUpEventHandler += (sender, e) =>
            {
                dialog.Close();
                cancelAction?.Invoke();
            };
            btnConfirm.MouseUpEventHandler += (sender, e) =>
            {
                dialog.Close();
                okAction?.Invoke();
            };
            if (isAlarmColor)
            {
                btnTitle.TextColor = CSS_Color.WarningColor;
                btnConfirm.TextColor = CSS_Color.MainBackgroundColor;
                btnConfirm.BackgroundColor = CSS_Color.WarningColor;
            }
        }
@@ -94,7 +241,7 @@
        /// <param name="str1">标题</param>
        public void QRcode(string str1)
        {
            Dialog dialog = new Dialog()
            Dialog dialog = new Dialog()
            {
                BackgroundColor = CSS.CSS_Color.viewTrans60lucence,
            };
@@ -119,18 +266,18 @@
                TextSize = TextSize.Text16,
                TextAlignment = TextAlignment.Center,
                IsBold = true,
                TextID=StringId.linshimima,
                TextID = StringId.linshimima,
            };
            whiteView.AddChidren(btnTitle);
            //密码
            Button btnpaw = new Button()
            {
                X=Application.GetRealWidth(100),
                X = Application.GetRealWidth(100),
                Y = Application.GetRealHeight(62),
                Height = Application.GetRealHeight(32),
                Width = Application.GetRealWidth(82),
                TextColor = MusicColor.SelectedColor,
                TextSize =24,
                TextSize = 24,
                TextAlignment = TextAlignment.Center,
                IsBold = true,
                Text = str1,
HDL_ON/UI/UI2/FuntionControlView/VideoDoorLock/CommonMethod.cs
New file
@@ -0,0 +1,588 @@
using System;
using HDL_ON.Entity;
using System.Collections.Generic;
using Shared;
using HDL_ON.DAL.Server;
#if __IOS__
#else
using Com.Videogo.Hdl;
#endif
namespace HDL_ON.UI.UI2.FuntionControlView.VideoDoorLock
{
    /// <summary>
    /// 萤石视频门锁公共方法类
    /// </summary>
    public class CommonMethod
    {
        private Loading loading;
        /// <summary>
        /// 记录当前界面索引值
        /// </summary>
        private int pageLayoutIndexValue;
        private static CommonMethod commonMethod = null;
        /// <summary>
        /// 获取对象
        /// </summary>
        public static CommonMethod Current
        {
            get
            {
                if (commonMethod == null)
                {
                    commonMethod = new CommonMethod();
                }
                return commonMethod;
            }
        }
        #region  --------- 跳转到Android,ios那边的方法(萤石视频门锁) --------
        /// <summary>
        /// android,ios源生添加设备到云端成功后回调方法
        /// 再读取云端的上萤石设备列表
        /// <paramref name="spk"/>spk</param>
        public void SkipAddDeviceActivity(string spk)
        {
            this.InitializationAndroidData((isEzChildAccessToken) =>
            {
                this.MainThread(() =>
                {
#if __IOS__
                    //跳转添加萤石设备
                    ezsdkDelegate = new IosIHdlInterface();
                    ezsdkDelegate.mAction += (serials) =>
                    {
                        this.GetYingshiDeviceList(serials);
                    };
                    EZSDK.IOS.EZSDK.SharedInstance().Delegate = ezsdkDelegate;
                    EZSDK.IOS.EZSDK.SharedInstance().AddEzvizMonitorWithDeviceType(spk);
#else
                HDLEzvizSdk.Instance.JumpToEZScanActivity(Application.Activity,spk);
                HDLEzvizSdk.SetAddCallback(new AndroidIHdlInterface((isBool, serials) =>
                {
                    if (isBool)
                    {
                        this.GetYingshiDeviceList(serials);
                    }
                }));
#endif
                });
            });
        }
        /// <summary>
        /// 读取云端的上萤石设备列表
        /// <paramref name="serials"/>序列号</param>
        private void GetYingshiDeviceList(string serials)
        {
            this.SunThread(() =>
            {
                var list = VideDoorLockSend.Current.GetVideoDoorLockDeviceList(SPK.VideoDoorLock);
                this.MainThread(() =>
                {
                    if (list.Count > 0)
                    {
                        var function = list.Find((o) => o.sid == serials);
                        if (function != null)
                        {
                            this.SaveFunctionFile(function);
                        }
                    }
                });
            });
        }
        /// <summary>
        /// 打开实时视频画面
        /// </summary>
        /// <param name="deviceSerial">设备序列号</param>
        /// <param name="deviceId">设备id(云端上deviceId)</param>
        /// <param name="spk">设备spk(云雀上定义好的)</param>
        /// <param name="isDialog">是否需要弹框</param>
        public void SkipRTVActivity(string deviceSerial, string deviceId, string spk, bool isDialog)
        {
            this.InitializationAndroidData((isEzChildAccessToken) =>
            {
                this.MainThread(() =>
                {
                    if (isDialog)
                    {
                        Video.View.ShowDialog.Currnet.ClickBox(Language.StringByID(StringId.laizimenlinghujiao), (dialog) =>
                        {
                            dialog.Close();
                            this.SkipRTVActivity(deviceSerial, deviceId, spk);
                        }, (dialog) => { dialog.Close(); });
                    }
                    else
                    {
                        this.SkipRTVActivity(deviceSerial, deviceId, spk);
                    }
                });
            });
        }
        /// <summary>
        /// 打开实时视频画面
        /// </summary>
        /// <param name="deviceSerial">设备序列号</param>
        /// <param name="deviceId">设备id(云端上deviceId)</param>
        /// <param name="spk">设备spk(云雀上定义好的)</param>
        private void SkipRTVActivity(string deviceSerial, string deviceId, string spk)
        {
#if __IOS__
            //打开萤石视频界面
            EZSDK.IOS.EZSDK.SharedInstance().PlayWithDeviceSerial(deviceSerial, deviceId, spk);
#else
            HDLEzvizSdk.Instance.JumpToEZRealPlayActivity(Application.Activity,deviceId,deviceSerial,spk);
#endif
        }
        /// <summary>
        /// 浏览历史记录
        /// </summary>
        public void SkipRecordActivity(string deviceId)
        {
            this.InitializationAndroidData((s) =>
            {
                this.MainThread(() =>
                {
#if __IOS__
                    //打开萤石历史记录界面
                    EZSDK.IOS.EZSDK.SharedInstance().ToDeviceMsgListView(deviceId);
#else
                HDLEzvizSdk.Instance.JumpLockHistoryActivity(Application.Activity, deviceId);
#endif
                });
            });
        }
        /// <summary>
        /// 临时密码开门
        /// <paramref name="deviceId"/>
        /// </summary>
        public void SkipPSWActivity(string deviceId)
        {
            this.InitializationAndroidData((isBools) =>
            {
                this.MainThread(() =>
                {
#if __IOS__
                    //打开萤石临时密码界面
                    EZSDK.IOS.EZSDK.SharedInstance().ToTemPassView(deviceId);
#else
                HDLEzvizSdk.Instance.JumpTempPasswordActivity(Application.Activity, deviceId);
#endif
                });
            });
        }
        /// <summary>
        /// 初始化萤石SDK(实际就是传参数,多次调用也没有影响)
        /// </summary>
        public void InitializationAndroidData(Action<bool> action)
        {
            bool isBool = true;
            this.SunThread(() =>
            {
                try
                {
                    //先获取萤石云子账号token
                    var ezChildAccessToken = VideDoorLockSend.Current.GetEZGetChildToken();
                    this.MainThread(() =>
                    {
                        if (string.IsNullOrEmpty(ezChildAccessToken))
                        {
                            //Token
                            isBool = false;
                            this.ShowTip("先获取萤石云子账号token失败。");
                            return;
                        }
#if __IOS__
                        //iOS
                        //初始化萤石云SDK,中文国内key、英文海外key 开发者账号使用应用包名申请的APPKEY,不同包名应用需配置不同的APPKEY
                        EZSDK.IOS.EZSDK.SharedInstance().InitLibWithAppKey("1aa98a90489b4838b966b57018b4b04b", "1aa98a90489b4838b966b57018b4b04b");
                        //1.设置所需河东的AccessToken和RefreshToken、域名地址
                        EZSDK.IOS.EZSDK.SharedInstance().SetHDlAccessToken(UserInfo.Current.LoginTokenString, UserInfo.Current.RefreshToken);
                        EZSDK.IOS.EZSDK.SharedInstance().SetRequestHttpsHostAndPlatform(OnAppConfig.Instance.RequestHttpsHost, 1, DB_ResidenceData.Instance.CurrentRegion.id);
                        //2.设置萤石子账号的AccessToken到SDK
                        EZSDK.IOS.EZSDK.SharedInstance().SetEZAccessToken(ezChildAccessToken);
                        //////3.打开摄像头设备列表页面
                        //EZSDK.IOS.EZSDK.SharedInstance().Go2EZvizMonitor();
                        //EZSDK.IOS.EZDeviceInfo info = new EZSDK.IOS.EZDeviceInfo();
                        //info.de
                        //EZSDK.IOS.EZSDK.Play(info);
#else
                            HDLEzvizSdk.Instance.Init(Application.Activity.Application, ezChildAccessToken, UserInfo.Current.LoginTokenString, UserInfo.Current.RefreshToken, OnAppConfig.Instance.RequestHttpsHost, "1aa98a90489b4838b966b57018b4b04b", 1, DB_ResidenceData.Instance.CurrentRegion.id);
#endif
                    });
                }
                catch (Exception e)
                {
                }
                finally
                {
                    this.MainThread(() =>
                    {
                        action?.Invoke(isBool);
                    });
                }
            });
        }
        /// <summary>
        /// 更换住宅
        /// </summary>
        /// <param name="home">对象</param>
        public void ChangeCurrHome(RegionInfoRes home)
        {
            if (DB_ResidenceData.Instance.CurrentRegion.id == home.id || string.IsNullOrEmpty(home.id)) return;
#if __IOS__
#else
                HDLEzvizSdk.Instance.SetHomeId(home.id);
#endif
        }
        #endregion
        /// <summary>
        /// 获取【门锁型号】列表
        /// </summary>
        /// <returns>返回结果不会为null</returns>
        public List<string> GetVideoDoorLockLockModelsList()
        {
            return VideDoorLockSend.Current.GetVideoDoorLockLockModelsList();
        }
        /// <summary>
        /// 门锁推送
        /// </summary>
        /// <param name="pushMessageType"></param>
        /// <param name="jPushMessageInfo"></param>
        public void DoorLockPush(JPushMessageInfo jpushMessageInfo)
        {
            this.MainThread(() =>
            {
                if (string.IsNullOrEmpty(jpushMessageInfo.expantContent)) return;
                //{ "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 != SPK.VideoDoorLock)
                {
                    return;
                }
                if (jpushMessageInfo.messageType.Contains(PushMessageType.DOOR_BELL.ToString()))
                {
                    ///打开视频门锁
                    this.SkipRTVActivity(expantContent.devSerial, expantContent.deviceId, expantContent.spk, true);
                }
                else if (jpushMessageInfo.messageType.Contains(PushMessageType.Alarm.ToString()))
                {
                    //低电量推送
                    this.UpdateDoorLockState(PushMessageType.Alarm);
                }
                else if (jpushMessageInfo.messageType.Contains(PushMessageType.Prompt.ToString()))
                {
                    //开门推送
                    this.UpdateDoorLockState(PushMessageType.Prompt);
                }
            });
        }
        /// <summary>
        /// 更新开锁图标和电池状态
        /// </summary>
        private void UpdateDoorLockState(PushMessageType pushMessageType)
        {
            int childrenCount = MainPage.BasePageView.ChildrenCount - 1;
            for (int i = childrenCount; childrenCount > i; i--)
            {
                View view = MainPage.BasePageView.GetChildren(i);
                if (view is VideoDoorLockPage)
                {
                    VideoDoorLockPage videoDoorLockPage = (VideoDoorLockPage)view;
                    if (videoDoorLockPage != null)
                    {
                        videoDoorLockPage.UpdateState(pushMessageType);
                    }
                }
            }
        }
        /// <summary>
        /// 获取萤石视频【门锁】列表
        /// </summary>
        /// <returns></returns>
        public List<Function> GetVideoDoorLockList()
        {
            var list = FunctionList.List.GetVideoDoorLockList();
#if DEBUG
            //list.Add(new Function { name = "视频门锁一", sid = "23456789", spk = SPK.VideoDoorLock });
            //list.Add(new Function { name = "视频门锁二", sid = "2345678922", spk = SPK.VideoDoorLock });
#endif
            return list;
        }
        #region  --------- 功能文件保存,删除 --------
        /// <summary>
        /// 保存本地文件
        /// </summary>
        /// <param name="function">当前设备</param>
        public void SaveFunctionFile(Function function)
        {
            if (function == null) return;
            function.AssembleStatus();
            function.SaveFunctionFile();
            FunctionList.List.IniFunctionList(function.savePath, true);
            MainPage.Log($"文件保存->{function.name}-->{function.spk}");
        }
        /// <summary>
        /// 删除本地文件
        /// </summary>
        /// <param name="function">当前设备</param>
        public void DeleteFunction(Function function)
        {
            if (function == null) return;
            FunctionList.List.DeleteFunction(function);
            MainPage.Log($"文件删除->{function.name}-->{function.spk}");
        }
        #endregion
        /// <summary>
        /// 萤石视频门锁的图标
        /// <param name="comerom">来自那里</param>
        /// </summary>
        public string GetVideoDoorLockIcon(Comerom comerom)
        {
            if (comerom == Comerom.collect)
            {
                return "FunctionIcon/DoorLock/VideoDoorLockOpen.png";
            }
            else
            {
                return "FunctionIcon/DoorLock/VideoDoorlockClose.png";
            }
        }
        /// <summary>
        /// 获取Loading对象
        /// </summary>
        /// <returns></returns>
        public Loading Loading
        {
            get
            {
                this.MainThread(() =>
                {
                    //if (loading != null && this.pageLayoutIndexValue == MainPage.BasePageView.ChildrenCount - 1)
                    //{
                    //    //防止二重添加对象
                    //    return;
                    //}
                    if (loading == null)//|| MainPage.BasePageView.ChildrenCount < 1)
                    {
                        loading = new Loading();
                    }
                    //loading.BringToFront();
                    Application.MainPage.AddChidren(loading);
                    //View view = MainPage.BasePageView.GetChildren(MainPage.BasePageView.ChildrenCount - 1);
                    //if (view is ViewGroup)
                    //{
                    //    pageLayoutIndexValue = MainPage.BasePageView.ChildrenCount - 1;
                    //    ((ViewGroup)view).AddChidren(loading);
                    //}
                });
                return loading;
            }
        }
        #region  ---------自定义线程(子线程,主线程)--------
        /// <summary>
        /// 子线程
        /// </summary>
        /// <paramref name="tipType"/>是否要提示错误信息(默认显示)<paramref>
        /// <param name="action"></param>
        public void SunThread(Action action, TipType tipType = TipType.confirmation)
        {
            new System.Threading.Thread(() =>
            {
                try
                {
                    action?.Invoke();
                }
                catch (Exception e)
                {
                    this.ShowAlert(e, tipType);
                }
            })
            { IsBackground = true }.Start();
        }
        /// <summary>
        /// 主线程(UI更新)
        /// </summary>
        /// <paramref name="tipType"/>是否要提示错误信息(默认显示)<paramref>
        /// <param name="action"></param>
        public void MainThread(Action action, TipType tipType = TipType.confirmation)
        {
            Application.RunOnMainThread(() =>
            {
                try
                {
                    action?.Invoke();
                }
                catch (Exception e)
                {
                    this.ShowAlert(e, tipType);
                }
            });
        }
        #endregion
        #region  --------- 提示框,确认框 --------
        /// <summary>
        /// 对话框(只要程序报错的时候才用到)
        /// </summary>
        /// <paramref name="e"/>异常对象<paramref>
        /// <paramref name="tipType"/>是否要提示错误信息(默认显示)<paramref>
        private void ShowAlert(Exception e, TipType tipType)
        {
            if (tipType != TipType.confirmation)
            {
                return;
            }
            Application.RunOnMainThread(() =>
            {
                string msg = e.Message + "\r\n" + e.StackTrace;
                Alert alert = new Alert("抱歉程序出错了.", "按\"确定\"能获取更详细的错误信息.", "取消", "确定");
                alert.Show();
                alert.ResultEventHandler += (alerts, isBool) =>
                {
                    alert.Dismiss();
                    if (isBool)
                    {
                        StackTraceLog stackTraceLog = new StackTraceLog(msg);
                        stackTraceLog.Show();
                    }
                };
            });
        }
        /// <summary>
        /// 信息提示窗口,自动关闭
        /// </summary>
        /// <param name="msg">提示错误文本</param>
        public void ShowTip(string msg, int time = 2)
        {
            Application.RunOnMainThread(() =>
            {
                new PublicAssmebly().TipMsgAutoClose(msg, false, time * 1000);
            });
        }
        #endregion
        /// <summary>
        /// 弹框类型
        /// </summary>
        public enum TipType
        {
            none,//无提示
            flicker,//闪烁框
            confirmation//确认框
        }
        /// <summary>
        /// 表示来自那个界面
        /// </summary>
        public enum Comerom
        {
            function,//功能
            collect,//收藏
            room,//房间
            push,//推送
        }
#if __IOS__
        IosIHdlInterface ezsdkDelegate;
        /// <summary>
        /// 专门定义给Ios回调用着,没有特殊含义
        /// </summary>
        public class IosIHdlInterface : EZSDK.IOS.EZSDKDelegate
        {
            public Action<string> mAction;
            public IosIHdlInterface()
            {
            }
            /// <summary>
            ///
            /// </summary>
            /// <param name="p0">true是入网成功(源生回调返回)</param>
            /// <param name="p1">设备的序列化(源生回调返回)</param>
            public override void AddDeviceSuccessed(string deviceSerial)
            {
                mAction?.Invoke(deviceSerial);
            }
        }
#else
        /// <summary>
        /// 专门定义给安卓回调用着,没有特殊含义
        /// </summary>
        public class AndroidIHdlInterface : Java.Lang.Object, IHdlInterface
        {
            Action<bool,string> mAction;
            public AndroidIHdlInterface(Action<bool,string> action)
            {
                mAction = action;
            }
            /// <summary>
            ///
            /// </summary>
            /// <param name="p0">true是入网成功(源生回调返回)</param>
            /// <param name="p1">设备的序列化(源生回调返回)</param>
            public void AddCallback(bool p0, string p1)
            {
                mAction?.Invoke(p0,p1);
            }
        }
#endif
    }
}
HDL_ON/UI/UI2/FuntionControlView/VideoDoorLock/ObjectClass.cs
New file
@@ -0,0 +1,104 @@
using System;
using System.Collections.Generic;
using HDL_ON.Entity;
namespace HDL_ON.UI.UI2.FuntionControlView.VideoDoorLock
{
    public class ObjectClass
    {
    }
    /// <summary>
    /// 用户信息(萤石视频门锁)
    /// </summary>
    public class UserVideoDoorLockInfo
    {
        /// <summary>
        /// 用户id
        /// </summary>
        public string extUserId = string.Empty;
        /// <summary>
        /// 用户名称
        /// </summary>
        public string extUserName = string.Empty;
    }
    /// <summary>
    /// 门锁状态(萤石视频门锁)
    /// </summary>
    public class VideoDoorLockInfo
    {
        /// <summary>
        /// 锁状态(lock:锁;unlock:解锁)
        /// </summary>
        public string lockStatus = string.Empty;
        /// <summary>
        /// 门状态(open:开;close:关)
        /// </summary>
        public string doorStatus = string.Empty;
    }
    /// <summary>
    /// 电池详情(萤石视频门锁)
    /// </summary>
    public class CellInfo
    {
        /// <summary>
        /// 电量
        /// </summary>
        public string remain = string.Empty;
        /// <summary>
        /// 电池名称
        /// </summary>
        public string name = string.Empty;
    }
    /// <summary>
    /// 获取门锁列表
    /// </summary>
    public class DoorLockList
    {
        /// <summary>
        /// 门锁设备列表
        /// </summary>
        public List<Function> list = new List<Function>();
    }
    /// <summary>
    /// 门锁型号列表
    /// </summary>
    public class LockModels {
        /// <summary>
        /// 型号列表
        /// </summary>
        public List<string> lockModels = new List<string>();
    }
    /// <summary>
    /// 推送内容对象
    /// </summary>
    public class ExpantContent
    {
        /// <summary>
        /// 设备序列号
        /// </summary>
        public string devSerial = string.Empty;
        /// <summary>
        /// 设备id
        /// </summary>
        public string deviceId = string.Empty;
        /// <summary>
        /// 不知道是啥
        /// </summary>
        public string interphoneTypeEnum = string.Empty;
        /// <summary>
        /// 不知道是啥
        /// </summary>
        public string subToken = string.Empty;
        /// <summary>
        /// 云雀上定义的设备spk
        /// </summary>
        public string spk = string.Empty;
    }
}
HDL_ON/UI/UI2/FuntionControlView/VideoDoorLock/StackTraceLog.cs
New file
@@ -0,0 +1,58 @@
using System;
using HDL_ON.UI.CSS;
using HDL_ON.UI.Music;
using Shared;
namespace HDL_ON.UI.UI2.FuntionControlView.VideoDoorLock
{
    public class StackTraceLog
    {
        /// <summary>
        /// 堆叠跟踪日志
        /// </summary>
        public string msg;
        public StackTraceLog(string msg)
        {
            this.msg = msg;
        }
        public void Show()
        {
            Dialog dialog = new Dialog()
            {
                BackgroundColor = CSS_Color.textWhiteColor,
            };
            dialog.Show();
            TopView topView = new TopView();
            topView.topNameBtn.Text="错误日志信息";
            dialog.AddChidren(topView.TopFLayoutView());
            topView.clickBackBtn.MouseUpEventHandler += (sen, e) =>
            {
                dialog.Close();
            };
            var middleFl = new FrameLayout
            {
                Y = topView.fLayout.Bottom,
                Height = Application.GetRealHeight(H_W.H - H_W.T_Height),
            };
            dialog.AddChidren(middleFl);
            Button btnLogText = new Button
            {
                //TextSize = TextSize.Text14,
                TextColor = MusicColor.Text18Color,
                Width = Application.GetRealWidth(H_W.W - 16 - 16),
                Height = middleFl.Height,
                X = Application.GetRealWidth(16),
                Text = this.msg,
                TextAlignment = TextAlignment.TopLeft,
                IsMoreLines = true,
            };
            middleFl.AddChidren(btnLogText);
        }
    }
}
HDL_ON/UI/UI2/FuntionControlView/VideoDoorLock/VideDoorLockSend.cs
New file
@@ -0,0 +1,237 @@
using System;
using System.Collections.Generic;
using System.Threading;
using HDL_ON.DAL.Server;
using HDL_ON.Entity;
using Shared;
using static HDL_ON.UI.UI2.FuntionControlView.VideoDoorLock.CommonMethod;
namespace HDL_ON.UI.UI2.FuntionControlView.VideoDoorLock
{
    /// <summary>
    /// 萤石视频门锁数据发送
    /// </summary>
    public class VideDoorLockSend
    {
        private static VideDoorLockSend send = null;
        /// <summary>
        /// 获取当前的对象
        /// </summary>
        public static VideDoorLockSend Current
        {
            get
            {
                if (send == null)
                {
                    send = new VideDoorLockSend();
                }
                return send;
            }
        }
        /// <summary>
        /// 解绑设备(萤石视频门锁)
        /// </summary>
        /// <param name="function">当前的设备</param>
        /// <param name="action">回调结果</param>
        /// <param name="tipType">是否需要提示,默认提示</param>
        public void DelDevice(Function function, Action<bool> action, TipType tipType = TipType.flicker)
        {
            new Thread(() =>
            {
                try
                {
                    Dictionary<string, object> d = new Dictionary<string, object>();
                    d.Add("homeId", DB_ResidenceData.Instance.CurrentRegion.id);
                    d.Add("deviceSerial", function.sid);//等同门锁序列号
                    d.Add("platform", 1);//平台
                    var responsePackNew = UI.Music.SendMethod.Current.RequestServerhomeId(d, NewAPI.Api_Post_DeleteDevice, "删除萤石门锁设备");
                    if (!this.DataChecking(responsePackNew, tipType))
                    {
                        return;
                    }
                    if (function != null)
                    {
                        action?.Invoke(true);
                    }
                }
                catch (Exception s)
                {
                }
            })
            { IsBackground = true }.Start();
        }
        /// <summary>
        /// 获取门锁状态(萤石视频门锁)
        /// </summary>
        /// <param name="function">当前的设备</param>
        /// <param name="tipType">是否需要提示,默认提示</param>
        /// <param name="return">返回结果不会为null</param>
        public VideoDoorLockInfo GetVideoDoorLockState(Function function, TipType tipType = TipType.flicker)
        {
            Dictionary<string, object> d = new Dictionary<string, object>();
            d.Add("homeId", DB_ResidenceData.Instance.CurrentRegion.id);
            d.Add("deviceId", function.deviceId);
            var responsePackNew = UI.Music.SendMethod.Current.RequestServerhomeId(d, NewAPI.Api_Post_Lockstatus, "获取萤石视频门锁状态");
            if (!this.DataChecking(responsePackNew,tipType))
            {
                return new VideoDoorLockInfo();
            }
            var videoDoorLockInfo = Newtonsoft.Json.JsonConvert.DeserializeObject<VideoDoorLockInfo>(responsePackNew.Data.ToString());
            if (videoDoorLockInfo == null)
            {
                return new VideoDoorLockInfo();
            }
            return videoDoorLockInfo;
        }
        /// <summary>
        /// 获取电池电量(萤石视频门锁)
        /// </summary>
        /// <param name="function">当前的设备</param>
        /// <param name="tipType">是否需要提示,默认提示</param>
        /// <param name="return">返回结果不会为null</param>
        public CellInfo GetCellValue(Function function, TipType tipType = TipType.flicker)
        {
            Dictionary<string, object> d = new Dictionary<string, object>();
            d.Add("homeId", DB_ResidenceData.Instance.CurrentRegion.id);
            d.Add("deviceId", function.deviceId);
            var responsePackNew = UI.Music.SendMethod.Current.RequestServerhomeId(d, NewAPI.Api_Post_Details, "获取萤石门锁设备电量");
            if (!this.DataChecking(responsePackNew,tipType))
            {
                return new CellInfo();
            }
            var cellInfo = Newtonsoft.Json.JsonConvert.DeserializeObject<CellInfo>(responsePackNew.Data.ToString());
            if (cellInfo == null)
            {
                return new CellInfo();
            }
            return cellInfo;
        }
        /// <summary>
        /// 获取门锁用户列表(萤石视频门锁)
        /// </summary>
        /// <param name="function">当前的设备</param>
        /// <param name="tipType">是否需要提示,默认提示</param>
        /// <param name="return">返回结果不会为null</param>
        public List<UserVideoDoorLockInfo> GetVideoDoorLockUserListInfo(Function function, TipType tipType = TipType.flicker)
        {
            Dictionary<string, object> d = new Dictionary<string, object>();
            d.Add("homeId", DB_ResidenceData.Instance.CurrentRegion.id);
            d.Add("deviceId", function.deviceId);
            var responsePackNew = UI.Music.SendMethod.Current.RequestServerhomeId(d, NewAPI.Api_Post_UserList, "获取萤石门锁用户列表");
            if (!this.DataChecking(responsePackNew, tipType))
            {
                return new List<UserVideoDoorLockInfo>();
            }
            var list = Newtonsoft.Json.JsonConvert.DeserializeObject<List<UserVideoDoorLockInfo>>(responsePackNew.Data.ToString());
            if (list == null)
            {
                return new List<UserVideoDoorLockInfo>();
            }
            return list;
        }
        /// <summary>
        /// 获取门锁设备列表(萤石视频门锁)
        /// </summary>
        /// <param name="spk">指定spk获取</param>
        /// <param name="tipType">是否需要提示,默认提示</param>
        /// <returns>返回结果不会为null</returns>
        public List<Function> GetVideoDoorLockDeviceList(string spk, TipType tipType = TipType.flicker)
        {
            Dictionary<string, object> d = new Dictionary<string, object>();
            d.Add("homeId", DB_ResidenceData.Instance.CurrentRegion.id);
            d.Add("spk", spk);
            var responsePackNew = UI.Music.SendMethod.Current.RequestServerhomeId(d, NewAPI.Api_Post_GetDevcieList, "获取萤石门锁设备列表");
            if (!this.DataChecking(responsePackNew, tipType))
            {
                return new List<Function>();
            }
            var doorLockList = Newtonsoft.Json.JsonConvert.DeserializeObject<DoorLockList>(responsePackNew.Data.ToString());
            if (doorLockList == null)
            {
                return new DoorLockList().list;
            }
            return doorLockList.list;
        }
        /// <summary>
        /// 获取门锁型号列表(萤石视频门锁)
        /// </summary>
        /// <param name="tipType">是否需要提示,默认提示</param>
        /// <returns>返回结果不会为null</returns>
        public List<string> GetVideoDoorLockLockModelsList(TipType tipType = TipType.flicker)
        {
            var responsePackNew = UI.Music.SendMethod.Current.RequestServerhomeId(new object { }, NewAPI.Api_Post_Lock_Models, "获取萤石门锁型号列表");
            if (!this.DataChecking(responsePackNew, tipType))
            {
                return new List<string>();
            }
            var lockModels = Newtonsoft.Json.JsonConvert.DeserializeObject<LockModels>(responsePackNew.Data.ToString());
            if (lockModels == null)
            {
                return new LockModels().lockModels;
            }
            return lockModels.lockModels;
        }
        /// <summary>
        /// 先获取萤石云子账号token
        /// </summary>
        /// <param name="tipType">是否需要提示,默认提示</param>
        public string GetEZGetChildToken(TipType tipType = TipType.flicker)
        {
            //先获取萤石云子账号token
            var responsePackNew = new HttpServerRequest().EZGetChildToken();
            if (!this.DataChecking(responsePackNew, tipType))
            {
                return "";
            }
            return responsePackNew.Data.ToString();
        }
        /// <summary>
        /// 检验数据回复成功或者失败
        /// </summary>
        /// <param name="responsePackNew">回复数据对象</param>
        /// <param name="tipType">是否需要提示</param>
        /// <returns></returns>
        private bool DataChecking(ResponsePackNew responsePackNew, TipType tipType)
        {
            if (responsePackNew.Data == null || responsePackNew.Code != "0" || responsePackNew.Data.ToString() == "")
            {
                if (TipType.flicker == tipType)
                {
                    if (responsePackNew == null)
                    {
                        responsePackNew = new ResponsePackNew { message = "没回复,请确认网络是否正常.", Code = "-1", };
                    }
                    Application.RunOnMainThread(() =>
                    {
                        //new Tip()
                        //{
                        //    CloseTime = 1,
                        //    Text = responsePackNew.message + "(" + responsePackNew.Code + ")",
                        //    Direction = AMPopTipDirection.None,
                        //}.Show(MainPage.BasePageView.GetChildren(MainPage.BasePageView.ChildrenCount - 1));
                        CommonMethod.Current.ShowTip(responsePackNew.message + "(" + responsePackNew.Code + ")");
                    });
                }
                return false;
            }
            return true;
        }
    }
}
HDL_ON/UI/UI2/FuntionControlView/VideoDoorLock/VideoDoorLockListPage.cs
New file
@@ -0,0 +1,222 @@
using Shared;
using HDL_ON.Stan;
using System;
using System.Collections.Generic;
using System.Text;
using HDL_ON.UI.CSS;
using HDL_ON.Entity;
namespace HDL_ON.UI.UI2.FuntionControlView.VideoDoorLock
{
    /// <summary>
    /// 视频门锁列表界面
    /// </summary>
    public class VideoDoorLockListPage : EditorCommonForm
    {
        #region ■ 变量声明___________________________
        /// <summary>
        /// 门锁设备列表
        /// </summary>
        private List<Function> listDevice = new List<Function>();
        /// <summary>
        /// 电池控件列表(key:设备的sid)
        /// </summary>
        private Dictionary<string, BatteryPersentControl> dicBatteryContr = new Dictionary<string, BatteryPersentControl>();
        /// <summary>
        /// 列表控件
        /// </summary>
        private VerticalListControl listView = null;
        /// <summary>
        /// 删除设备后需要更新界面的回调
        /// </summary>
        public Action action;
        #endregion
        #region ■ 初始化_____________________________
        public VideoDoorLockListPage(Action action) {
            this.action = action;
        }
        /// <summary>
        /// 画面显示(底层会固定调用此方法,借以完成画面创建)
        /// </summary>
        /// <param name="i_listDevice">门锁设备列表</param>
        public void ShowForm(List<Function> i_listDevice)
        {
            this.listDevice.AddRange(i_listDevice);
            //智能门锁
            base.SetTitleText(Language.StringByID(StringId.shipinmensuo));
            //初始化中部信息
            this.InitMiddleFrame();
        }
        /// <summary>
        /// 初始化中部信息
        /// </summary>
        private void InitMiddleFrame()
        {
            //清空bodyFrame
            this.ClearBodyFrame();
            string nowSelectId = string.Empty;
            //楼层下拉图标
            var btnFloor = new NormalViewControl(500, Application.GetRealHeight(16), false);
            var btnFloorIcon = new IconViewControl(16);
            btnFloorIcon.X = HdlControlResourse.XXLeft;
            btnFloorIcon.Y = Application.GetRealHeight(18);
            btnFloorIcon.UnSelectedImagePath = "Public/DownIcon.png";
            bodyFrameLayout.AddChidren(btnFloorIcon);
            btnFloorIcon.ButtonClickEvent += (sender, e) =>
            {
                //显示下拉列表
                var form = new FloorRoomSelectPopupView();
                form.ShowDeviceFunctionView(btnFloor, this.listDevice, (selectId, listFunc) =>
                {
                    btnFloor.Width = btnFloor.GetRealWidthByText();//重置文本宽度
                    nowSelectId = selectId;
                    //重新初始化门锁列表控件
                    this.InitDoorListControl(listFunc);
                }, nowSelectId);
            };
            //楼层
            btnFloor.X = btnFloorIcon.Right + Application.GetRealWidth(2);
            btnFloor.TextColor = CSS_Color.FirstLevelTitleColor;
            btnFloor.TextSize = CSS_FontSize.PromptFontSize_FirstLevel;
            btnFloor.Text = DB_ResidenceData.Instance.CurFloor.roomName;
            //btnFloor.Width = btnFloor.GetRealWidthByText();
            bodyFrameLayout.AddChidren(btnFloor);
            //让它相对图标居中
            btnFloor.Y = btnFloorIcon.Y + (btnFloorIcon.Height - btnFloor.Height) / 2;
            btnFloor.ButtonClickEvent += (sender, e) =>
            {
                btnFloorIcon.ButtonClickEvent(null, null);
            };
            //列表控件
            this.listView = new VerticalListControl();
            listView.Y = Application.GetRealHeight(53);
            listView.Height = bodyFrameLayout.Height - Application.GetRealHeight(53);
            bodyFrameLayout.AddChidren(listView);
            //初始化门锁列表控件
            this.InitDoorListControl(this.listDevice);
        }
        #endregion
        #region ■ 添加门锁控件_______________________
        /// <summary>
        /// 初始化门锁列表控件
        /// </summary>
        private void InitDoorListControl(List<Function> i_listDevice)
        {
            this.listView.RemoveAll();
            this.dicBatteryContr = new Dictionary<string, BatteryPersentControl>();
            //生成门锁控件
            foreach (var device in i_listDevice)
            {
                this.AddDoorControl(device);
            }
        }
        /// <summary>
        /// 添加门锁控件
        /// </summary>
        /// <param name="i_device">门锁对象</param>
        private void AddDoorControl(Function i_device)
        {
            //白色背景容器
            var frameBack = new FrameLayoutStatuControl();
            frameBack.Width = Application.GetRealWidth(343);
            frameBack.Height = Application.GetRealHeight(96);
            frameBack.Radius = (uint)Application.GetRealWidth(12);
            frameBack.Gravity = Gravity.CenterHorizontal;
            frameBack.BackgroundColor = CSS_Color.MainBackgroundColor;
            this.listView.AddChidren(frameBack);
            //门锁图标
            var btnIcon = new IconViewControl(32);
            btnIcon.X = Application.GetRealWidth(10);
            btnIcon.Y = Application.GetRealHeight(15);
            btnIcon.UnSelectedImagePath = "FunctionIcon/DoorLock/DoorLock.png";
            frameBack.AddChidren(btnIcon, ChidrenBindMode.BindEvent);
            //设备名字
            var btnName = new Button();
            btnName.X = btnIcon.Right + Application.GetRealWidth(12);
            btnName.Y = Application.GetRealHeight(12);
            btnName.Width = Application.GetRealWidth(150);
            btnName.Height = Application.GetRealHeight(20);
            btnName.TextColor = CSS_Color.FirstLevelTitleColor;
            btnName.TextAlignment = TextAlignment.CenterLeft;
            btnName.Text = i_device.name;
            frameBack.AddChidren(btnName, ChidrenBindMode.BindEvent);
            //房间
            var btnRoom = new Button();
            btnRoom.X = btnName.X;
            btnRoom.Y = btnName.Bottom + Application.GetRealHeight(4);
            btnRoom.Width = Application.GetRealWidth(150);
            btnRoom.Height = Application.GetRealHeight(15);
            btnRoom.TextColor = CSS_Color.PromptingColor1;
            btnRoom.TextSize = CSS_FontSize.PromptFontSize_SecondaryLevel;
            btnRoom.TextAlignment = TextAlignment.CenterLeft;
            btnRoom.Text = i_device.GetRoomListName();
            frameBack.AddChidren(btnRoom, ChidrenBindMode.BindEvent);
            //电池图标
            var btnBattery = new BatteryPersentControl();
            btnBattery.Y = Application.GetRealHeight(62);
            //frameBack.AddChidren(btnBattery, ChidrenBindMode.BindEvent);
            btnBattery.InitControl();
            btnBattery.SetValue(80);
            btnBattery.X = frameBack.Width - btnBattery.Width - Application.GetRealWidth(12);
            this.dicBatteryContr[i_device.sid] = btnBattery;
            frameBack.ButtonClickEvent += (sender, e) =>
            {
                var form = new VideoDoorLockPage(i_device, btnName, btnRoom, CommonMethod.Comerom.function,()=> {
                    this.CloseForm();
                    this.action?.Invoke();
                });
                MainPage.BasePageView.AddChidren(form);
                MainPage.BasePageView.PageIndex = MainPage.BasePageView.ChildrenCount - 1;
                form.Show();
            };
            //底部再加个间距
            var frameSpace = new FrameLayout();
            frameSpace.Height = Application.GetRealHeight(12);
            this.listView.AddChidren(frameSpace);
        }
        #endregion
        #region ■ 设备状态推送_______________________
        /// <summary>
        /// 设备状态推送
        /// </summary>
        /// <param name="i_LocalDevice"></param>
        public override void DeviceStatuPush(Function i_LocalDevice)
        {
            //不是目标设备
            if (this.dicBatteryContr.ContainsKey(i_LocalDevice.sid) == false)
            {
                return;
            }
        }
        #endregion
    }
}
HDL_ON/UI/UI2/FuntionControlView/VideoDoorLock/VideoDoorLockPage.cs
New file
@@ -0,0 +1,540 @@
using Shared;
using System;
using System.Collections.Generic;
using System.Text;
using HDL_ON.UI.CSS;
using HDL_ON.Entity;
using HDL_ON.DriverLayer;
using HDL_ON.UI.Music;
using HDL_ON.UI.UI2.FuntionControlView.VideoDoorLock;
namespace HDL_ON.UI
{
    /// <summary>
    /// 视频门锁的控制界面
    /// </summary>
    public class VideoDoorLockPage : FrameLayout
    {
        #region ■ 变量声明___________________________
        /// <summary>
        /// 设备
        /// </summary>
        private Function device;
        /// <summary>
        /// 上一级界面的设备名字控件
        /// </summary>
        private Button btnDeviceName;
        /// <summary>
        /// 上一级界面的房间名字控件
        /// </summary>
        private Button btnRoomName;
        /// <summary>
        /// 头部布局
        /// </summary>
        private TopView topView;
        /// <summary>
        /// 当前设备名称
        /// </summary>
        private Button btnCurrDeviceName;
        /// <summary>
        /// 区域
        /// </summary>
        private Button btnCurrDeviceRoom;
        /// <summary>
        /// 电量父控件
        /// </summary>
        private FrameLayout cellFrame;
        /// <summary>
        /// 电量
        /// </summary>
        private Button btnCell;
        /// <summary>
        /// 电量进度条
        /// </summary>
        private DiyArcSeekBar cellDiyArcSeekBar;
        /// <summary>
        ///收藏图标
        /// </summary>
        private Button btnCollectIcon;
        /// <summary>
        /// 门锁状态
        /// </summary>
        private Button btnDoorLockIcon;
        /// <summary>
        /// 实时视频
        /// </summary>
        private CustomFrameLayout rtvFL;
        /// <summary>
        /// 临时密码
        /// </summary>
        private CustomFrameLayout pswFL;
        /// <summary>
        /// 历史记录
        /// </summary>
        private CustomFrameLayout recordFL;
        /// <summary>
        /// 表示来自那个界面
        /// </summary>
        private CommonMethod.Comerom comerom;
        /// <summary>
        /// 删除设备后需要更新界面的回调
        /// </summary>
        public Action action;
        #endregion
        /// <summary>
        /// 构造函数
        /// </summary>
        /// <param name="function">设备</param>
        /// <param name="btnDeviceName">上一级界面的设备名字控件(注:不能传null,没有可以传new Button())</param>
        /// <param name="btnRoomName">上一级界面的房间名字控件(注:不能传null,没有可以传new Button())</param>
        public VideoDoorLockPage(Function function, Button btnDeviceName, Button btnRoomName, CommonMethod.Comerom comerom, Action action)
        {
            this.device = function;
            this.btnDeviceName = btnDeviceName;
            this.btnRoomName = btnRoomName;
            this.comerom = comerom;
            this.action = action;
        }
        public void Show()
        {
            //初始化UI
            this.InitUI();
            //初始化事件
            this.EventListener();
            //读取数据
            this.ReadData();
        }
        /// <summary>
        /// 初始化界面
        /// </summary>
        private void InitUI()
        {
            #region   ---界面布局---
            this.BackgroundColor = MusicColor.ViewColor;
            this.topView = new TopView();
            this.topView.setBtn.Visible = true;
            this.topView.topNameBtn.TextID = StringId.shipinmensuo;
            this.AddChidren(topView.TopFLayoutView());
            var middleFl = new FrameLayout
            {
                Y = topView.fLayout.Bottom,
                Height = Application.GetRealHeight(H_W.H - H_W.T_Height),
            };
            this.AddChidren(middleFl);
            var whiteFl = new FrameLayout
            {
                Y = Application.GetRealHeight(24),
                X = Application.GetRealWidth(24),
                Height = Application.GetRealHeight(526),
                Width = Application.GetRealWidth(327),
                BackgroundImagePath = "MusicIcon/playBj.png",
                Name = "fl",
            };
            middleFl.AddChidren(whiteFl);
            btnCollectIcon = new Button
            {
                X = Application.GetRealWidth(264),
                Y = Application.GetRealHeight(14),
                Width = Application.GetRealWidth(40),
                Height = Application.GetRealWidth(40),
                UnSelectedImagePath = "MusicIcon/collect.png",
                SelectedImagePath = "MusicIcon/collectSelected.png",
                IsSelected = this.device.collect,
                Name = "collect"
            };
            whiteFl.AddChidren(btnCollectIcon);
            btnCurrDeviceName = new Button
            {
                TextSize = TextSize.Text24,
                TextColor = MusicColor.Text18Color,
                Width = Application.GetRealWidth(160),
                Height = Application.GetRealHeight(33),
                Y = Application.GetRealHeight(16),
                X = Application.GetRealWidth(16),
                Text = this.device.name,
                TextAlignment = TextAlignment.CenterLeft,
            };
            whiteFl.AddChidren(btnCurrDeviceName);
            btnCurrDeviceRoom = new Button
            {
                TextSize = TextSize.Text12,
                TextColor = MusicColor.MusicNoTxetColor,
                Width = Application.GetRealWidth(160),
                Height = Application.GetRealHeight(17),
                Y = btnCurrDeviceName.Bottom + Application.GetRealHeight(4),
                X = Application.GetRealWidth(16),
                Text = this.device.GetRoomListName(),
                TextAlignment = TextAlignment.CenterLeft,
            };
            whiteFl.AddChidren(btnCurrDeviceRoom);
            cellFrame = new FrameLayout
            {
                X = btnCurrDeviceRoom.Right + Application.GetRealWidth(20),
                Y = btnCurrDeviceName.Bottom + Application.GetRealHeight(5),
                Width = Application.GetRealWidth(30),
                Height = Application.GetRealHeight(16),
            };
            whiteFl.AddChidren(cellFrame);
            cellDiyArcSeekBar = new DiyArcSeekBar
            {
                X = Application.GetRealWidth(3),
                Y = Application.GetRealHeight(3),
                Width = cellFrame.Width + Application.GetRealWidth(-6),
                Height = cellFrame.Height + Application.GetRealHeight(-6),
                Progress = 60,
                ProgressBarColor = MusicColor.MusicNoTxetColor,
                MaxValue = 100,
                MinValue = 0,
                //IsCanMove = false,
                //IsCanScrolled=false,
            };
            //cellFrame.AddChidren(cellDiyArcSeekBar);
            btnCell = new Button
            {
                TextSize = TextSize.Text10,
                TextColor = MusicColor.TextColor,
                Text = "60" + "%",
                TextAlignment = TextAlignment.Center,
                UnSelectedImagePath = "FunctionIcon/DoorLock/Cell.png",
            };
            cellFrame.AddChidren(btnCell);
            //门锁状态
            btnDoorLockIcon = new Button
            {
                X = Application.GetRealWidth(65),
                Y = Application.GetRealHeight(108),
                Width = Application.GetRealWidth(198),
                Height = Application.GetRealWidth(200),
                UnSelectedImagePath = "FunctionIcon/DoorLock/UnLocked.png",
                SelectedImagePath = "FunctionIcon/DoorLock/UnLocking.png",
            };
            whiteFl.AddChidren(btnDoorLockIcon);
            this.CalculatedPosition();//重新计算宽度
            int heightY = btnDoorLockIcon.Bottom + Application.GetRealHeight(70);
            //实时视频
            rtvFL = new CustomFrameLayout(CustomFrameLayout.widthFrameLayout, CustomFrameLayout.heightFrameLayout);
            whiteFl.AddChidren(rtvFL);
            rtvFL.Y = heightY;
            rtvFL.X = Application.GetRealWidth(41);
            rtvFL.AddImageView();
            rtvFL.AddTextButtonView();
            rtvFL.GetImageButton().UnSelectedImagePath = "FunctionIcon/DoorLock/RTV.png";
            rtvFL.GetTextButton().TextID = StringId.shishishipin;
            //历史记录
            recordFL = new CustomFrameLayout(CustomFrameLayout.widthFrameLayout, CustomFrameLayout.heightFrameLayout);
            whiteFl.AddChidren(recordFL);
            recordFL.Y = heightY;
            recordFL.X = rtvFL.Right + Application.GetRealWidth(CustomFrameLayout.interval);
            recordFL.AddImageView();
            recordFL.AddTextButtonView();
            recordFL.GetImageButton().UnSelectedImagePath = "FunctionIcon/DoorLock/HistoryList.png";
            recordFL.GetTextButton().TextID = StringId.lishijilu;
            //临时密码
            pswFL = new CustomFrameLayout(CustomFrameLayout.widthFrameLayout, CustomFrameLayout.heightFrameLayout);
            whiteFl.AddChidren(pswFL);
            pswFL.Y = heightY;
            pswFL.X = recordFL.Right + Application.GetRealWidth(CustomFrameLayout.interval);
            pswFL.AddImageView();
            pswFL.AddTextButtonView();
            pswFL.GetImageButton().UnSelectedImagePath = "FunctionIcon/DoorLock/OneOpenLock.png";
            pswFL.GetTextButton().TextID = StringId.linshimima1;
            #endregion
        }
        /// <summary>
        /// 注册事件
        /// </summary>
        private void EventListener()
        {
            //返回
            this.topView.clickBackBtn.MouseUpEventHandler += (sender, e) =>
            {
                this.RemoveFromParent();
            };
            //设置
            this.topView.clickSetBtn.MouseUpEventHandler += (sender, e) =>
            {
                CommonMethod.Current.MainThread(() =>
                {
                    //调用秀绕的界面
                    var infoView = new UI.FunctionBaseInfoSetPage(this.device, () =>
                     {
                         if (this.btnDeviceName == null || this.btnRoomName == null || this.device == null)
                         {
                             return;
                         }
                         ////刷新显示
                         this.btnDeviceName.Text = this.device.name;
                         this.btnRoomName.Text = this.device.GetRoomListName();
                         this.btnCurrDeviceName.Text = this.device.name;
                         this.btnCurrDeviceRoom.Text = this.device.GetRoomListName();
                         this.CalculatedPosition();//重新计算宽度
                     });
                    infoView.actionDel += () =>
                      {
                          //解绑设备后
                          this.RemoveFromParent();
                          this.action?.Invoke();
                      };
                    MainPage.BasePageView.AddChidren(infoView);
                    infoView.LoadPage();
                    MainPage.BasePageView.PageIndex = MainPage.BasePageView.ChildrenCount - 1;
                });
            };
            //收藏
            this.btnCollectIcon.MouseUpEventHandler += (sender, e) =>
            {
                btnCollectIcon.IsSelected = this.device.collect = !btnCollectIcon.IsSelected;
                this.device.CollectFunction();
            };
            //实时视频
            this.rtvFL.SetClickListener((fl, btnStateImage, btnStateText) =>
            {
                CommonMethod.Current.SkipRTVActivity(this.device.sid, this.device.deviceId, this.device.spk, false);
            });
            //临时密码
            this.pswFL.SetClickListener((fl, btnStateImage, btnStateText) =>
            {
                CommonMethod.Current.SkipPSWActivity(this.device.deviceId);
            });
            //历史记录
            this.recordFL.SetClickListener((fl, btnStateImage, btnStateText) =>
            {
                CommonMethod.Current.SkipRecordActivity(this.device.deviceId);
            });
        }
        /// <summary>
        /// 初始数据
        /// </summary>
        private void ReadData()
        {
            CommonMethod.Current.Loading.Start();
            CommonMethod.Current.SunThread(() =>
            {
                try
                {
                    var videoDoorLockInfo = VideDoorLockSend.Current.GetVideoDoorLockState(this.device);
                    var cellInfo = VideDoorLockSend.Current.GetCellValue(this.device);
                    CommonMethod.Current.MainThread(() =>
                    {
                        //this.cellDiyArcSeekBar.Progress = i;
                        //更新电量值
                        this.btnCell.Text = cellInfo.remain + "%";
                        this.btnDoorLockIcon.IsSelected = videoDoorLockInfo.doorStatus == "open";
                    });
                }
                catch { }
                finally
                {
                    Application.RunOnMainThread(() =>
                    {
                        CommonMethod.Current.Loading.Hide();
                    });
                }
            });
        }
        /// <summary>
        /// 重新计算宽度(设备名称,房间控件)
        /// </summary>
        private void CalculatedPosition()
        {
            this.btnCurrDeviceName.Width = this.btnCurrDeviceName.GetTextWidth();
            if (this.btnCurrDeviceName.GetTextWidth() > this.btnCollectIcon.X)
            {
                //重新计算宽度
                this.btnCurrDeviceName.Width = this.btnCollectIcon.X + Application.GetRealWidth(-10);
            }
            this.btnCurrDeviceRoom.Width = this.btnCurrDeviceRoom.GetTextWidth();
            if (this.btnCurrDeviceRoom.GetTextWidth() > this.btnCollectIcon.X)
            {
                //重新计算宽度
                this.btnCurrDeviceRoom.Width = this.btnCollectIcon.X + Application.GetRealWidth(-20 - 10);
            }
            this.cellFrame.X = this.btnCurrDeviceRoom.Right + Application.GetRealWidth(20);
        }
        /// <summary>
        /// 更新状态
        /// </summary>
        public void UpdateState(PushMessageType pushMessageType)
        {
            CommonMethod.Current.MainThread(() =>
            {
                if (pushMessageType == PushMessageType.Alarm)
                {
                    //门锁电池值
                    if (this.btnCell != null)
                    {
                        //videoDoorLockPage.btnCell.Text = "";
                    }
                }
                else
                {
                    if (this.btnDoorLockIcon != null && !this.btnDoorLockIcon.IsSelected)
                    {
                        this.btnDoorLockIcon.IsSelected = false;
                    }
                }
            });
        }
    }
    /// <summary>
    /// 自己弄一个FrameLayout
    /// </summary>
    class CustomFrameLayout : FrameLayout
    {
        public const int widthFrameLayout = 48;
        public const int heightFrameLayout = 53;
        public const int yFrameLayout = 378;
        public const int xFrameLayout = 41;
        public const int interval = 51;//行中的列间隔值
        public CustomFrameLayout(int width, int height, int x = 0, int y = 0)
        {
            this.Width = Application.GetRealWidth(width);
            this.Height = Application.GetRealHeight(height);
            this.X = Application.GetRealWidth(x);
            this.Y = Application.GetRealHeight(y);
        }
        Button btnStateImage = new Button
        {
            Width = Application.GetRealWidth(32),
            Height = Application.GetRealWidth(32),
            Gravity = Gravity.TopCenter,
            Name = "btnStateImage",
        };
        Button btnStateText = new Button
        {
            Y = Application.GetRealHeight(4),
            Width = Application.GetRealWidth(100),
            Height = Application.GetRealWidth(20),
            TextID = StringId.dangqianmenweiguan,
            TextSize = TextSize.Text12,
            TextColor = MusicColor.TextCancelColor,
            TextAlignment = TextAlignment.Center,
            Gravity = Gravity.CenterHorizontal,
            Name = "btnStateText"
        };
        public void AddImageView()
        {
            this.AddChidren(btnStateImage);
        }
        public void AddTextButtonView()
        {
            btnStateText.Y += btnStateImage.Bottom;
            this.AddChidren(btnStateText);
        }
        public Button GetImageButton()
        {
            //if (!this.AddWithout(this.btnStateImage))
            //{
            //    this.AddImageView();
            //}
            return this.btnStateImage;
        }
        public Button GetTextButton()
        {
            //if (!this.AddWithout(this.btnStateText))
            //{
            //    this.AddTextButtonView();
            //}
            return this.btnStateText;
        }
        /// <summary>
        /// 事件监听方法
        /// </summary>
        /// <param name="action">回调(第一个是父类对象;第二个是图标对象;第三个是状态对象</param>
        /// <param name="button1">注意:在SetClickListener()前面调用AddImageView()才有效</param>
        /// <param name="button2">注意:在SetClickListener()前面调用AddImageView()才有效</param>
        public void SetClickListener(Action<FrameLayout, Button, Button> action)
        {
            EventHandler<MouseEventArgs> click = (sender, e) =>
                    {
                        action?.Invoke(this, btnStateImage, btnStateText);
                    };
            this.MouseUpEventHandler += click;
            btnStateImage.MouseUpEventHandler += click;
            btnStateText.MouseUpEventHandler += click;
        }
        /// <summary>
        /// 在父布局查找子控件是否存在
        /// </summary>
        /// <param name="btn">查找对象</param>
        /// <returns>存在为true,否则为false</returns>
        private bool AddWithout(View btn)
        {
            if (this.ChildrenCount <= 0 || btn == null)
            {
                return false;
            }
            for (int i = 0; i < this.ChildrenCount; i++)
            {
                View view = this.GetChildren(i);
                if (view == null)
                {
                    continue;
                }
                if (view is Button)
                {
                    if (view.Name == btn.Name)
                    {
                        return true;
                    }
                }
            }
            return false;
        }
    }
}
HDL_ON/UI/UI2/UserPage.cs
@@ -485,9 +485,10 @@
                {
                    btnNavigationSelectionIcon.SetRotation(0f);
                    ContextView.RemoveAll();
                    var classificaitionView = new ClassificationPage();
                    var classificaitionView = new ClassificationPage();
                    ContextView.AddChidren(classificaitionView);
                    classificaitionView.LoadPage();
                });
            })
            { IsBackground = true, Priority = System.Threading.ThreadPriority.Lowest }.Start();