gxc
2019-11-29 ac334861efbf06933e95c62ced0484410f34bece
2019.11.29
85个文件已添加
8个文件已修改
20012 ■■■■■ 已修改文件
ZigbeeApp/.vs/GateWay/xs/UserPrefs.xml 45 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ZigbeeApp/.vs/GateWay/xs/project-cache/GateWay.Droid-Debug.json 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ZigbeeApp/.vs/GateWay/xs/project-cache/Shared.Droid-Debug.json 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ZigbeeApp/.vs/GateWay/xs/sqlite3/storage.ide 补丁 | 查看 | 原始文档 | blame | 历史
ZigbeeApp/GateWay.Droid/Assets/Phone/Room/Humidity.png 补丁 | 查看 | 原始文档 | blame | 历史
ZigbeeApp/GateWay.Droid/Assets/Phone/Room/List.png 补丁 | 查看 | 原始文档 | blame | 历史
ZigbeeApp/GateWay.Droid/Assets/Phone/Room/Temperature.png 补丁 | 查看 | 原始文档 | blame | 历史
ZigbeeApp/GateWay.Droid/GateWay.Droid.csproj 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ZigbeeApp/Shared.Droid/Additions/AboutAdditions.txt 48 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ZigbeeApp/Shared.Droid/BaseActivity.cs 871 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ZigbeeApp/Shared.Droid/Button.cs 353 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ZigbeeApp/Shared.Droid/CommonClass.cs 106 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ZigbeeApp/Shared.Droid/Encryption/BASE64.cs 53 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ZigbeeApp/Shared.Droid/Encryption/BigInteger.cs 3137 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ZigbeeApp/Shared.Droid/Encryption/DES.cs 75 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ZigbeeApp/Shared.Droid/Encryption/RSA.cs 42 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ZigbeeApp/Shared.Droid/IO/FileUtils.cs 261 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ZigbeeApp/Shared.Droid/Jars/AboutJars.txt 37 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ZigbeeApp/Shared.Droid/Jars/EzvizGlobalAPI.jar 补丁 | 查看 | 原始文档 | blame | 历史
ZigbeeApp/Shared.Droid/Jars/HDLArcSeekbar-release.aar 补丁 | 查看 | 原始文档 | blame | 历史
ZigbeeApp/Shared.Droid/Jars/MyJar.jar 补丁 | 查看 | 原始文档 | blame | 历史
ZigbeeApp/Shared.Droid/Jars/libammsdk.jar 补丁 | 查看 | 原始文档 | blame | 历史
ZigbeeApp/Shared.Droid/MyBroadcastReceive.cs 100 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ZigbeeApp/Shared.Droid/MyService.cs 199 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ZigbeeApp/Shared.Droid/Net/NetWiFi.cs 188 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ZigbeeApp/Shared.Droid/Net/WifiUtil.cs 107 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ZigbeeApp/Shared.Droid/Other/DensityUtil.cs 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ZigbeeApp/Shared.Droid/Other/MusicInfo.cs 133 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ZigbeeApp/Shared.Droid/Other/MusicService.cs 111 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ZigbeeApp/Shared.Droid/Other/Server.cs 74 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ZigbeeApp/Shared.Droid/Other/ServerHandler.cs 273 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ZigbeeApp/Shared.Droid/Other/Volume.cs 40 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ZigbeeApp/Shared.Droid/Properties/AssemblyInfo.cs 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ZigbeeApp/Shared.Droid/Shared.Droid.csproj 218 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ZigbeeApp/Shared.Droid/Shared.Droid.sln 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ZigbeeApp/Shared.Droid/SplashActivity.cs 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ZigbeeApp/Shared.Droid/Transforms/EnumFields.xml 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ZigbeeApp/Shared.Droid/Transforms/EnumMethods.xml 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ZigbeeApp/Shared.Droid/Transforms/Metadata.xml 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ZigbeeApp/Shared.Droid/UI/Alert.cs 97 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ZigbeeApp/Shared.Droid/UI/Application.cs 229 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ZigbeeApp/Shared.Droid/UI/ArcScaleSeekBar.cs 250 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ZigbeeApp/Shared.Droid/UI/ArcSeekBar.cs 357 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ZigbeeApp/Shared.Droid/UI/Button.cs 378 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ZigbeeApp/Shared.Droid/UI/Camera.cs 228 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ZigbeeApp/Shared.Droid/UI/ColorPicker.cs 123 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ZigbeeApp/Shared.Droid/UI/Contacts.cs 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ZigbeeApp/Shared.Droid/UI/CropImage.cs 126 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ZigbeeApp/Shared.Droid/UI/CurtainRollSeekBar.cs 245 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ZigbeeApp/Shared.Droid/UI/CurtainSeekBar.cs 249 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ZigbeeApp/Shared.Droid/UI/DateView.cs 74 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ZigbeeApp/Shared.Droid/UI/Dialog.cs 156 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ZigbeeApp/Shared.Droid/UI/DrawerLayout (副本).cs 340 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ZigbeeApp/Shared.Droid/UI/EditText.cs 548 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ZigbeeApp/Shared.Droid/UI/EditTextView.cs 546 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ZigbeeApp/Shared.Droid/UI/Enum.cs 78 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ZigbeeApp/Shared.Droid/UI/FrameLayout.cs 90 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ZigbeeApp/Shared.Droid/UI/GDMapView.cs 56 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ZigbeeApp/Shared.Droid/UI/GestureLockView.cs 152 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ZigbeeApp/Shared.Droid/UI/HorizontalPages.cs 530 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ZigbeeApp/Shared.Droid/UI/HorizontalScrolViewLayout.cs 214 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ZigbeeApp/Shared.Droid/UI/HorizontalSeekBar.cs 354 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ZigbeeApp/Shared.Droid/UI/ImageView.cs 344 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ZigbeeApp/Shared.Droid/UI/Lanuage.cs 90 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ZigbeeApp/Shared.Droid/UI/Loading.cs 196 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ZigbeeApp/Shared.Droid/UI/MusicVerticalScrolViewLayout.cs 418 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ZigbeeApp/Shared.Droid/UI/MyEchartsView.cs 182 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ZigbeeApp/Shared.Droid/UI/PageLayout.cs 801 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ZigbeeApp/Shared.Droid/UI/PickerView.cs 241 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ZigbeeApp/Shared.Droid/UI/QRCode.cs 61 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ZigbeeApp/Shared.Droid/UI/RowLayout.cs 397 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ZigbeeApp/Shared.Droid/UI/Spinner.cs 178 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ZigbeeApp/Shared.Droid/UI/SwipeLayout.cs 323 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ZigbeeApp/Shared.Droid/UI/TextView.cs 242 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ZigbeeApp/Shared.Droid/UI/TimeView.cs 140 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ZigbeeApp/Shared.Droid/UI/Tip.cs 61 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ZigbeeApp/Shared.Droid/UI/UICoverFlowView.cs 326 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ZigbeeApp/Shared.Droid/UI/UIDrawerLayout.cs 328 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ZigbeeApp/Shared.Droid/UI/UIPickerView.cs 186 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ZigbeeApp/Shared.Droid/UI/UrlMonitor.cs 94 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ZigbeeApp/Shared.Droid/UI/VerticalRefreshLayout.cs 360 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ZigbeeApp/Shared.Droid/UI/VerticalScrolViewLayout.cs 42 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ZigbeeApp/Shared.Droid/UI/VerticalSeekBar.cs 414 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ZigbeeApp/Shared.Droid/UI/Video.cs 217 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ZigbeeApp/Shared.Droid/UI/View.cs 1277 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ZigbeeApp/Shared.Droid/UI/ViewGroup.cs 270 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ZigbeeApp/Shared.Droid/UI/WaveSeekBar.cs 331 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ZigbeeApp/Shared.Droid/UI/WiimuUPnp.cs 125 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ZigbeeApp/Shared.Droid/Utils/HDLUtils.cs 44 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ZigbeeApp/Shared.Droid/Utils/TouchIDUtils.cs 205 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ZigbeeApp/Shared/.DS_Store 补丁 | 查看 | 原始文档 | blame | 历史
ZigbeeApp/Shared/DLL/Android/Shared.Droid.dll 补丁 | 查看 | 原始文档 | blame | 历史
ZigbeeApp/Shared/Phone/UserView/UserHomeView.cs 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ZigbeeApp/.vs/GateWay/xs/UserPrefs.xml
@@ -2,45 +2,32 @@
  <MonoDevelop.Ide.ItemProperties.GateWay.Droid PreferredExecutionTarget="Android.M7BBB18B19152766" />
  <MonoDevelop.Ide.ItemProperties.GateWay.Ios automaticSigning="False" PreferredExecutionTarget="MonoDevelop.IPhone.IPhoneDeviceTarget.8c0bdb303f25d82c2a42fb8bfca449bfaca00260" />
  <MonoDevelop.Ide.ItemProperties.ShardLib PreferredExecutionTarget="Android.M7BBB18B19152766" />
  <MonoDevelop.Ide.Workbench ActiveDocument="Shared/Phone/Device/Account/AccountForgetPWD.cs">
  <MonoDevelop.Ide.Workbench ActiveDocument="Shared/Phone/Device/CommonForm/SceneCategoryView.cs">
    <Files>
      <File FileName="Shared/Phone/UserView/UserHomeView.cs" Line="1577" Column="26" />
      <File FileName="Shared/Phone/Device/Category/Category.cs" Line="1727" Column="19" />
      <File FileName="Shared/Phone/UserView/UserHomeView.cs" Line="668" Column="1" />
      <File FileName="Shared/Phone/Device/Category/Category.cs" Line="1620" Column="51" />
      <File FileName="Shared/Phone/Device/AC/ACControl.cs" Line="422" Column="94" />
      <File FileName="Shared/Phone/ZigBee/Device/CommonDevice.cs" Line="2889" Column="58" />
      <File FileName="Shared/Phone/Device/DeviceLogic/ReadDeviceAttributeLogic.cs" Line="226" Column="1" />
      <File FileName="Shared/Phone/UserView/UserPage.cs" Line="503" Column="61" />
      <File FileName="Shared/Phone/UserView/HomePage.cs" Line="1" Column="1" />
      <File FileName="Shared/Phone/ZigBee/Device/CommonDevice.cs" Line="2895" Column="20" />
      <File FileName="Shared/Phone/Device/DeviceLogic/ReadDeviceAttributeLogic.cs" Line="67" Column="55" />
      <File FileName="Shared/Common/CommonPage.cs" Line="10" Column="45" />
      <File FileName="Shared/Phone/Device/Account/AccountLogin.cs" Line="86" Column="57" />
      <File FileName="Shared/Phone/Device/Account/AccountLoginByCode.cs" Line="90" Column="57" />
      <File FileName="Shared/Phone/Device/Account/AccountRegister.cs" Line="68" Column="57" />
      <File FileName="Shared/Phone/Device/Account/AccountRegisterSuccess.cs" Line="171" Column="62" />
      <File FileName="Shared/Phone/Device/Account/AccountForgetPWD.cs" Line="64" Column="57" />
      <File FileName="Shared/Phone/UserView/HomePage.cs" Line="1" Column="1" />
      <File FileName="Shared/Phone/Device/Category/CategoryAddScene.cs" Line="970" Column="60" />
      <File FileName="Shared/Common/Room.cs" Line="1132" Column="55" />
      <File FileName="Shared/Phone/Device/CommonForm/SceneCategoryView.cs" Line="75" Column="27" />
    </Files>
    <Pads>
      <Pad Id="ProjectPad">
        <State name="__root__">
          <Node name="GateWay" expanded="True">
            <Node name="DroidLib" expanded="True" />
            <Node name="GateWay.Droid" expanded="True">
              <Node name="Assets" expanded="True">
                <Node name="Phone" expanded="True" />
              </Node>
            </Node>
            <Node name="Shared" expanded="True">
              <Node name="Common" expanded="True" />
              <Node name="Phone" expanded="True">
                <Node name="Device" expanded="True">
                  <Node name="AC" expanded="True" />
                  <Node name="Account" expanded="True">
                    <Node name="AccountForgetPWD.cs" selected="True" />
                  </Node>
                  <Node name="Category" expanded="True" />
                  <Node name="CommonForm" expanded="True" />
                  <Node name="Curtain" expanded="True" />
                  <Node name="CommonForm" expanded="True">
                    <Node name="SceneCategoryView.cs" selected="True" />
                  </Node>
                  <Node name="DeviceLogic" expanded="True" />
                  <Node name="Light" expanded="True" />
                </Node>
                <Node name="UserView" expanded="True" />
              </Node>
@@ -48,15 +35,15 @@
          </Node>
        </State>
      </Pad>
      <Pad Id="MonoDevelop.Debugger.WatchPad">
        <State />
      </Pad>
    </Pads>
  </MonoDevelop.Ide.Workbench>
  <MonoDevelop.Ide.DebuggingService.PinnedWatches />
  <MonoDevelop.Ide.Workspace ActiveConfiguration="Debug|iPhone" />
  <MonoDevelop.Ide.DebuggingService.Breakpoints>
    <BreakpointStore>
      <Breakpoint file="/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Account/AccountRegister.cs" relfile="Shared/Phone/Device/Account/AccountRegister.cs" line="278" column="1" />
      <Breakpoint file="/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Account/AccountLoginByCode.cs" relfile="Shared/Phone/Device/Account/AccountLoginByCode.cs" line="289" column="1" />
    </BreakpointStore>
    <BreakpointStore />
  </MonoDevelop.Ide.DebuggingService.Breakpoints>
  <MultiItemStartupConfigurations />
</Properties>
ZigbeeApp/.vs/GateWay/xs/project-cache/GateWay.Droid-Debug.json
@@ -1 +1 @@
{"Format":1,"ProjectReferences":[],"MetadataReferences":[{"FilePath":"/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/packages/BouncyCastle.Crypto.dll.1.8.1/lib/BouncyCastle.Crypto.dll","Aliases":[]},{"FilePath":"/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/DroidLib/bin/Debug/DroidLib.dll","Aliases":[]},{"FilePath":"/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/packages/FastAndroidCamera.2.0.0/lib/MonoAndroid403/FastAndroidCamera.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Java.Interop.dll","Aliases":[]},{"FilePath":"/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/DLL/M2Mqtt.Net.dll","Aliases":[]},{"FilePath":"/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/packages/Microsoft.AppCenter.Analytics.1.14.0/lib/MonoAndroid403/Microsoft.AppCenter.Analytics.Android.Bindings.dll","Aliases":[]},{"FilePath":"/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/packages/Microsoft.AppCenter.Analytics.1.14.0/lib/MonoAndroid403/Microsoft.AppCenter.Analytics.dll","Aliases":[]},{"FilePath":"/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/packages/Microsoft.AppCenter.1.14.0/lib/MonoAndroid403/Microsoft.AppCenter.Android.Bindings.dll","Aliases":[]},{"FilePath":"/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/packages/Microsoft.AppCenter.Crashes.1.14.0/lib/MonoAndroid403/Microsoft.AppCenter.Crashes.Android.Bindings.dll","Aliases":[]},{"FilePath":"/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/packages/Microsoft.AppCenter.Crashes.1.14.0/lib/MonoAndroid403/Microsoft.AppCenter.Crashes.dll","Aliases":[]},{"FilePath":"/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/packages/Microsoft.AppCenter.1.14.0/lib/MonoAndroid403/Microsoft.AppCenter.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v8.0/Mono.Android.dll","Aliases":[]},{"FilePath":"/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/packages/MQTTnet.2.4.0/lib/netstandard1.3/MQTTnet.Core.dll","Aliases":[]},{"FilePath":"/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/packages/MQTTnet.2.4.0/lib/netstandard1.3/MQTTnet.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/mscorlib.dll","Aliases":[]},{"FilePath":"/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/DLL/Newtonsoft.Json.dll","Aliases":[]},{"FilePath":"/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/DLL/Security.dll","Aliases":[]},{"FilePath":"/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/DLL/Android/Shared.Droid.dll","Aliases":[]},{"FilePath":"/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/DLL/Android/Shared.Droid.HDLWidget.dll","Aliases":[]},{"FilePath":"/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/DLL/Android/Shared.Droid.Smartrefresh.dll","Aliases":[]},{"FilePath":"/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/DLL/Android/Shared.Droid.TouchID.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/System.Core.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/System.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/System.IO.Compression.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/System.Net.Http.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Runtime.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/System.Web.Services.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/System.Xml.dll","Aliases":[]},{"FilePath":"/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/DLL/Android/Xamarin.Android.Arch.Core.Common.dll","Aliases":[]},{"FilePath":"/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/DLL/Android/Xamarin.Android.Arch.Lifecycle.Common.dll","Aliases":[]},{"FilePath":"/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/DLL/Android/Xamarin.Android.Arch.Lifecycle.Runtime.dll","Aliases":[]},{"FilePath":"/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/DLL/Android/Xamarin.Android.Support.Animated.Vector.Drawable.dll","Aliases":[]},{"FilePath":"/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/DLL/Android/Xamarin.Android.Support.Annotations.dll","Aliases":[]},{"FilePath":"/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/DLL/Android/Xamarin.Android.Support.Compat.dll","Aliases":[]},{"FilePath":"/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/DLL/Android/Xamarin.Android.Support.Core.UI.dll","Aliases":[]},{"FilePath":"/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/DLL/Android/Xamarin.Android.Support.Core.Utils.dll","Aliases":[]},{"FilePath":"/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/DLL/Android/Xamarin.Android.Support.Fragment.dll","Aliases":[]},{"FilePath":"/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/DLL/Android/Xamarin.Android.Support.Media.Compat.dll","Aliases":[]},{"FilePath":"/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/DLL/Android/Xamarin.Android.Support.v4.dll","Aliases":[]},{"FilePath":"/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/DLL/Android/Xamarin.Android.Support.v7.AppCompat.dll","Aliases":[]},{"FilePath":"/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/DLL/Android/Xamarin.Android.Support.v7.RecyclerView.dll","Aliases":[]},{"FilePath":"/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/DLL/Android/Xamarin.Android.Support.Vector.Drawable.dll","Aliases":[]},{"FilePath":"/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/packages/ZXing.Net.Mobile.2.4.1/lib/MonoAndroid71/ZXing.Net.Mobile.Core.dll","Aliases":[]},{"FilePath":"/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/packages/ZXing.Net.Mobile.2.4.1/lib/MonoAndroid71/zxing.portable.dll","Aliases":[]},{"FilePath":"/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/packages/ZXing.Net.Mobile.2.4.1/lib/MonoAndroid71/ZXingNetMobile.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Diagnostics.Contracts.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Diagnostics.FileVersionInfo.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Net.Security.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Xml.XPath.XDocument.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Net.WebSockets.Client.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.IO.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Dynamic.Runtime.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Runtime.Serialization.Xml.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Security.Principal.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Reflection.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Threading.ThreadPool.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Security.Cryptography.Cng.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.ComponentModel.EventBasedAsync.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Security.Cryptography.Encryption.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Runtime.CompilerServices.VisualC.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Threading.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Security.Cryptography.DeriveBytes.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/netstandard.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.IO.UnmanagedMemoryStream.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.ServiceModel.Http.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.IO.FileSystem.AccessControl.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Xml.XPath.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Xml.XmlDocument.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Xml.Xsl.Primitives.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Resources.Writer.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Console.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Net.Cache.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Net.Sockets.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Text.Encoding.Extensions.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Net.NetworkInformation.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Net.Utilities.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Security.Principal.Windows.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Security.Claims.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.ServiceModel.Primitives.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Security.Cryptography.Hashing.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.ComponentModel.Primitives.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.IO.FileSystem.DriveInfo.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Security.Cryptography.X509Certificates.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Reflection.Primitives.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Runtime.Numerics.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.IO.FileSystem.Watcher.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Diagnostics.TraceSource.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Reflection.Emit.Lightweight.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Text.Encoding.CodePages.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Linq.Expressions.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Threading.Timer.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Runtime.InteropServices.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.IO.Pipes.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Net.HttpListener.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Text.RegularExpressions.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Threading.Tasks.Parallel.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Collections.NonGeneric.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Collections.Concurrent.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Threading.Overlapped.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Security.Cryptography.Pkcs.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Runtime.Handles.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Data.SqlClient.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.ObjectModel.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Net.WebHeaderCollection.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Runtime.InteropServices.RuntimeInformation.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.ComponentModel.TypeConverter.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Net.Mail.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Threading.Tasks.Extensions.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Linq.Parallel.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Xml.XDocument.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Security.SecureString.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/Microsoft.Win32.Registry.AccessControl.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Security.Cryptography.RSA.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.ComponentModel.Annotations.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.IO.FileSystem.Primitives.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Security.Cryptography.Primitives.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.IO.Compression.ZipFile.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Runtime.InteropServices.WindowsRuntime.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Linq.Queryable.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Resources.ResourceManager.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Resources.Reader.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Collections.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Reflection.Emit.ILGeneration.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Data.Common.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Net.NameResolution.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.ComponentModel.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.ServiceProcess.ServiceController.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Security.Cryptography.Encryption.ECDiffieHellman.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Runtime.Loader.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.ServiceModel.Security.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Net.AuthenticationManager.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Xml.ReaderWriter.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Threading.Tasks.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Diagnostics.Tracing.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.AppContext.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Buffers.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Security.Cryptography.Encryption.ECDsa.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Security.Cryptography.Csp.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Diagnostics.TextWriterTraceListener.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Text.Encoding.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.IO.MemoryMappedFiles.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Security.Cryptography.OpenSsl.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/Microsoft.Win32.Registry.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Globalization.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Security.Cryptography.RandomNumberGenerator.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Collections.Specialized.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Security.Cryptography.ProtectedData.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.ValueTuple.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Xml.XPath.XmlDocument.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Net.ServicePoint.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Xml.XmlSerializer.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Reflection.Extensions.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Globalization.Extensions.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Runtime.Extensions.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Resources.ReaderWriter.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Security.Cryptography.Encoding.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.IO.IsolatedStorage.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Threading.AccessControl.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.ServiceModel.NetTcp.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Security.AccessControl.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Reflection.TypeExtensions.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Globalization.Calendars.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Net.Requests.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Net.WebSockets.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Reflection.Emit.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.IO.FileSystem.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Runtime.Serialization.Json.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Security.Cryptography.Algorithms.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Threading.Thread.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Linq.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Diagnostics.Process.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Diagnostics.Tools.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Security.Cryptography.Hashing.Algorithms.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Diagnostics.Debug.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/Microsoft.Win32.Primitives.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Runtime.Serialization.Primitives.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Diagnostics.TraceEvent.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Drawing.Primitives.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Runtime.Serialization.Formatters.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Net.Ping.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.ServiceModel.Duplex.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Diagnostics.StackTrace.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Reflection.DispatchProxy.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Security.Cryptography.Encryption.Aes.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Memory.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Net.Primitives.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Drawing.Common.dll","Aliases":[]}],"Files":["/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Application.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Resources/Resource.designer.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Properties/AssemblyInfo.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/app.config","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/packages.config","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Resources/AboutResources.txt","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Properties/AndroidManifest.xml","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Resources/layout/Main.axml","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Resources/values/Strings.xml","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Resources/values/Styles.xml","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/libs/armeabi-v7a/libelianjni.so","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/libs/armeabi-v7a/libjcore127.so","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Resources/drawable/Loading.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Resources/mipmap-xxhdpi/Icon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Resources/mipmap-mdpi/Icon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Resources/mipmap-hdpi/Icon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Resources/mipmap-xhdpi/Icon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Resources/mipmap-xxxhdpi/Icon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Resources/drawable/Icon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Resources/xml/file_paths.xml","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Language.ini","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Account/Account.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Account/Cancle.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Account/Cat.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Account/ChangeSuccess.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Account/Code.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Account/HidePwd.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Account/Logo_loginBG.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Account/Logo_White.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Account/Password.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Account/PhoneEmail_White.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Account/UnhidePwd.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/AC/Add.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/AC/Fan_Height.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/AC/Fan_HeightSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/AC/Fan_Low.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/AC/Fan_LowSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/AC/Fan_Middle.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/AC/Fan_MiddleSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/AC/Group.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/AC/Mode_Auto.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/AC/Mode_AutoSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/AC/Mode_Cool.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/AC/Mode_CoolSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/AC/Mode_Dry.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/AC/Mode_DrySelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/AC/Mode_Fan.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/AC/Mode_FanSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/AC/Mode_Heat.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/AC/Mode_HeatSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/AC/OpenOrClose.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/AC/OpenOrCloseSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/AC/Path.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/AC/Reduce.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/AC/SelectedFanModeBG.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/AC/SelectedModeBG.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/BindPic/BindAdd.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/BindPic/BindDown.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/BindPic/BindEmptyPic.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/BindPic/BindLeft.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/BindPic/BindRight.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Center/Abount.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Center/Admin.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Center/Backup.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Center/DeviceManagement.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Center/ImperialCrown.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Center/MenberManagement.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Center/Opinion.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Center/ResidenceManagement.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Center/SafetyManagement.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Device/AirConditioner.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Device/AirConditionerEpoint.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Device/AirConditionerZbGateway.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Device/AirSwitch.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Device/AirSwitchCloudContr.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Device/ButtonPanel.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Device/ButtonPanelFour.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Device/ButtonPanelOne.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Device/ButtonPanelThree.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Device/ButtonPanelTwo.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Device/ColorLight.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Device/Converter.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Device/ConverterZb485.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Device/Curtain.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Device/CurtainAutoOpen.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Device/CurtainSiphonate.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Device/DimmableLight.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Device/DimmableLightOneLoad.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Device/DryContact.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Device/IntelligentLocks.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Device/IntelligentLocksH06C.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Device/Light.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Device/PanelTable.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Device/Relay.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Device/RelayEpoint.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Device/RelayThreeLoad.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Device/Repeater.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Device/Sensor.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Device/SensorCarbonMonoxide.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Device/SensorDoorWindow.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Device/SensorEmergencyButton.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Device/SensorFire.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Device/SensorHumidity.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Device/SensorInfrared.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Device/SensorMotion.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Device/SensorPir.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Device/SensorTemperature.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Device/SensorWater.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Device/Socket1.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Device/Switch.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/DoorLock/AddFailedPic.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/DoorLock/AddFingerprintTipPic.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/DoorLock/AddIcCardTipPic.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/DoorLock/AddIcon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/DoorLock/AddPasswordTicPic.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/DoorLock/AllMethod.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/DoorLock/AllMethodIcon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/DoorLock/AllMethodOn.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/DoorLock/CancelIcon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/DoorLock/DateIcon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/DoorLock/DelIcon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/DoorLock/DistributeUnlockIcon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/DoorLock/DooorLockPicOpen.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/DoorLock/DoorLockClose.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/DoorLock/DoorlockIcon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/DoorLock/DoorLockOpen.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/DoorLock/DoorLockPicClose.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/DoorLock/DoorlockPicture.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/DoorLock/DoorLockUserPic.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/DoorLock/EntrySuccessIcon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/DoorLock/FavoriteIcon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/DoorLock/Fingerprint.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/DoorLock/Fingerprint207.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/DoorLock/FingerprintOn.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/DoorLock/Left.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/DoorLock/MemberIcon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/DoorLock/Password.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/DoorLock/PasswordOn.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/DoorLock/proximityCard.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/DoorLock/proximityCardOn.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/DoorLock/RecordIcon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/DoorLock/RemoteUnlockIcon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/DoorLock/RightIcon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/DoorLock/RoomPic.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/DoorLock/SelectedIcon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/DoorLock/SettingIcon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/DoorLock/ShareIcon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/DoorLock/SideslipPic.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/DoorLock/Switch.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/DoorLock/SwitchOn.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/DoorLock/TemPasswordVisiable.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/DoorLock/TempPasswordBackground.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/DoorLock/TempPasswordBackground1.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/DoorLock/TypeIcon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/DoorLock/UndistributeIcon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/DoorLock/UnLockBlankPic.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/DoorLock/UnLockButton.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/DoorLock/UnlockFailed.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/DoorLock/UnLockSideslipIcon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/DoorLock/UnlockSuccess.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/DoorLock/UnselectedIcon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/DoorLock/VisitorIcon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Floor/Floor.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Floor/FloorSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/FunctionIcon/10Icon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/FunctionIcon/10IconSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/FunctionIcon/11Icon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/FunctionIcon/11IconSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/FunctionIcon/12Icon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/FunctionIcon/12IconSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/FunctionIcon/13Icon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/FunctionIcon/13IconSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/FunctionIcon/14Icon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/FunctionIcon/14IconSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/FunctionIcon/15Icon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/FunctionIcon/15IconSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/FunctionIcon/16Icon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/FunctionIcon/16IconSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/FunctionIcon/17Icon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/FunctionIcon/17IconSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/FunctionIcon/18Icon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/FunctionIcon/18IconSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/FunctionIcon/19Icon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/FunctionIcon/19IconSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/FunctionIcon/1Icon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/FunctionIcon/1IconSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/FunctionIcon/20Icon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/FunctionIcon/20IconSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/FunctionIcon/2Icon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/FunctionIcon/2IconSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/FunctionIcon/3Icon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/FunctionIcon/3IconSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/FunctionIcon/4Icon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/FunctionIcon/4IconSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/FunctionIcon/5Icon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/FunctionIcon/5IconSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/FunctionIcon/6Icon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/FunctionIcon/6IconSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/FunctionIcon/7Icon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/FunctionIcon/7IconSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/FunctionIcon/8Icon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/FunctionIcon/8IconSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/FunctionIcon/9Icon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/FunctionIcon/9IconSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Gateway/GatewayIcon1.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Gateway/GatewayIcon6.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Gateway/RealGateway1.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Gateway/RealGateway6.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Gateway/WiredGateway.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Gateway/WiredGatewayInstruct.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Instruct/DeviceSearch.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Instruct/DimmableLightOneLoad.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Instruct/IntelligentLocksH06C.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Instruct/PanelFourButton.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Instruct/PanelThreeButton.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Instruct/PanelTwoButton.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Instruct/RelayThreeLoad.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/Add.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/Add_Category.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/Add_GW.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/Back.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/BottomShadow.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/CancelIcon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/Category_FunctionBG.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/Category_FunctionBGSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/Check.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/CloseIcon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/Collection.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/Collection1.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/CollectionSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/CollectionSelected1.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/DateSearchIcon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/DeleteIcon1.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/DeleteIcon2.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/DeleteIcon2Selected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/Down.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/DownLoad.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/Drop_Down.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/FixedPosition.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/FixedPositionSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/Floor.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/ForgotPswList.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/FunctionCardView.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/FunctionCardViewSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/FunctionViewBG.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/GarrisonList.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/GarrisonListSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/HidenPWD.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/House.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/HouseSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/ItemSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/More.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/NewVersion.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/Next.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/NoBindGW.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/NoFunction.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/OpenIcon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/PersentIcon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/PickerColorWheel.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/Point.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/ProgressMsg.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/PswSettion.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/PswSettionSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/QRCode.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/Remote.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/ResidenceIcon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/RightIcon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/Room.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/RoomIcon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/SceneCard.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/SceneFunctionBG.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/ScreeningType.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/Search.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/SelectFloor_Left.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/SelectHouse.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/ShardMenu.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/Switch.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/Switch1.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/Switch2.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/Switch2Selected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/SwitchSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/SwitchSelected1.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/Time.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/Timer.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/Tips.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/UnHidenPWD.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/UnLockFail.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/UnLockSuccess.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/UpperTriangle.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/VirtualFrame.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/WrongIcon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Logo/Logo.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Navigation/Category.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Navigation/CategorySelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Navigation/Home.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Navigation/HomeSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Navigation/Setting.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Navigation/SettingSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/RealDevice/AirSwitchCloudContr.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/RealDevice/CommonDevice.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/RealDevice/CurtainAutoOpen.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/RealDevice/CurtainSiphonate.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/RealDevice/ButtonPanelFour.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/RealDevice/ButtonPanelFourNotPower.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/RealDevice/ButtonPanelThree.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/RealDevice/ButtonPanelTwo.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/RealDevice/SensorCarbonMonoxide.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/RealDevice/SensorDoorWindow.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/RealDevice/SensorEmergencyButton.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/RealDevice/SensorFire.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/RealDevice/SensorInfrared.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/RealDevice/SensorMotion.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/RealDevice/SensorPir.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/RealDevice/SensorWater.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Room/RoomCardView.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Room/RoomCardView_Name.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Room/Room_Rectangle.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Safeguard/ProtectionAtHome.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Safeguard/ProtectionAtHomeSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Safeguard/ProtectionRemoveHome.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Safeguard/ProtectionRemoveHomeSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Safeguard/WithdrawGarrison.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Safeguard/WithdrawGarrisonSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Account/Back.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Scene/Delaying.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/AC/AC_TIP.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/RoomIcon/0.JPG","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/RoomIcon/1.JPG","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/RoomIcon/2.JPG","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/RoomIcon/3.JPG","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/RoomIcon/4.JPG","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/RoomIcon/5.JPG","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/SceneIcon/0.jpg","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/SceneIcon/1.jpg","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/SceneIcon/2.jpg","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/SceneIcon/3.jpg","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/SceneIcon/4.jpg","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/SceneIcon/5.jpg","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/SceneIcon/6.jpg","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/SceneIcon/7.jpg","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/SceneIcon/8.jpg","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/SceneIcon/9.jpg","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/InputAccountIcon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/InputAccountIconSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/MemberNotEsixtPic.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/NotAuthority.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/NotShardPic.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/ScanQRcodeIcon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/ScanQRcodeIconSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/1.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/2.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/3.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/ac.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/add.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/AddSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/airswitch.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/athome.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/back.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/connect.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/curtain.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/Ddmmablelight.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/delay.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/delay1.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/deviceselectedbackgroundcolor.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/deviceunselectedbackgroundcolor.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/dimmableLight.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/doorlock.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/drop-down.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/dropdown.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/function.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/function1.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/humidity.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/iconBackgroundColor.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/iconSelectedBackgroundColor.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/leavehome.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/light.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/light_1.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/logicaddcolor.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/logicbj1.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/logicbj2.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/logicclose.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/logicopen.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/next.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/nodelay.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/nofunction.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/noon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/noscene.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/nosecurity.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/panel.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/point.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/position.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/scene.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/scene1.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/security.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/security1.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/selected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/selectedac.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/selectedairswitch.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/selectedcurtain.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/selecteddimmableLight.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/selecteddoorlock.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/selectedlight.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/selectedmonth.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/selectedpanel.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/selectedsenor.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/selectedsensor13.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/selectedsensor21.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/selectedsensor22.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/selectedsensor277.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/selectedsensor40.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/selectedsensor42.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/selectedsensor43.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/selectedsensor44.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/sensor13.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/sensor21.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/sensor22.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/sensor277.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/sensor40.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/sensor42.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/sensor43.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/sensor44.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/sign.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/sunrise.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/sunset.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/temperature.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/time.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/timeparagraph.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/timepoint.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/withdrawal.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/ItemUnSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Gateway/WiredGatewaySearching.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/BottomButtonGround.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/FailIcon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Light/DeskLamp.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Light/DeskLampSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/Message.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/MessageSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/MyHome.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/NextSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/SelectFloor_Right.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/Shared.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/RoomIconBackground.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/RoomIconBackgroundSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Room/FavoriteRoom.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Room/ItemSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Room/ItemUnSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Room/ItemUnSelected_Black.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Room/NoNameRoom.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/DoorLock/DelBackground.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/DoorLock/TemPasswordInvisiable.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/GwSwitchIcon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/GwSwitchIconSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Instruct/CurtainAutoOpen.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/DeviceLimitGround.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/DownTriangle.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/UpTriangle.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/DeviceLimitGroundSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Instruct/CurtainSiphonate.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Instruct/SensorInfrared.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Instruct/SensorDoorWindow.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Instruct/SensorCarbonMonoxide.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Instruct/SensorWater.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Instruct/AirSwitchCloudContr.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Instruct/RepeaterZigbee.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Instruct/AirConditionerZbGateway.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Device/RepeaterZigbee.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Instruct/SensorFire.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/lockadd.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/selectedhumidity.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/selectedtemperature.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/CreatFloor.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/CreatFloorSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/RoomIconSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Device/AirConditionerEpointSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/WarningIcon1.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/AC/Mode_Cool2.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/AC/Mode_Dry2.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/AC/Mode_Fan2.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/AC/Mode_Heat2.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/IndoorUnitGround.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/BindPic/BindRoomColor.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/BindPic/BindRoomColorOn.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Scene/SceneIcon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Scene/Selected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Safeguard/SafetyShortcut.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Safeguard/SafetyShortcutSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Device/ThirdPartyDevice.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Account/QQ.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Account/Wechat.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/HadAuthority.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Safeguard/SafeguardPasswordGround.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/PhoneBook.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/RollerShade/Close.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/RollerShade/CloseSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/RollerShade/Down.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/RollerShade/DownSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/RollerShade/Open.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/RollerShade/OpenSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/RollerShade/Stop.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/RollerShade/StopSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/RollerShade/Up.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/RollerShade/UpSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Gateway/AddGatewaySuccess.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Gateway/WirelessGatewaySearching.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/DroidLib/DroidLib.csproj","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Light/OFF.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Light/OFFSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Light/ON.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Light/OnOff.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Light/ONSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Light/Plug.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Light/PlugSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Gateway/WirelessApDirection.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Gateway/WirelessApGatewaySearching.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Gateway/WirelessGateway.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Loading/1.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Loading/10.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Loading/11.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Loading/12.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Loading/13.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Loading/14.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Loading/15.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Loading/16.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Loading/17.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Loading/18.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Loading/19.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Loading/2.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Loading/20.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Loading/21.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Loading/22.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Loading/23.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Loading/24.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Loading/25.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Loading/26.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Loading/27.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Loading/28.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Loading/29.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Loading/3.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Loading/30.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Loading/31.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Loading/32.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Loading/4.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Loading/5.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Loading/6.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Loading/7.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Loading/8.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Loading/9.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/AC/Swing_1.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/AC/Swing_1Selected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/AC/Swing_2.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/AC/Swing_2Selected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/AC/Swing_3.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/AC/Swing_3Selected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/AC/Swing_4.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/AC/Swing_4Selected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/AC/Swing_5.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/AC/Swing_5Selected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/AC/Swing_Auto.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/AC/Swing_AutoSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/AC/SwingBackground.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Common/ComparerDeviceUI.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Common/Device.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Common/House.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Common/Logic.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Common/ResponseEntity/ApkInfoOBJ.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Common/ResponseEntity/FirmwareManaRes.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Common/ResponseEntity/GetAppVersionCode.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Common/ResponseEntity/ResultPack.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Common/ResponseEntity/UserLoginLocalRegionRes.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Pad/MainPage.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/R.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Common/ZigbeeColor.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Common/CommonPage.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Common/ResultStatus.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Common/ResponseEntity/BackupInfoRes.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Common/ResponseEntity/FolderRes.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Common/ResponseEntity/GatewayRes.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Common/ResponseEntity/GetAreaCode.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Common/ResponseEntity/ResidenceRes.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Common/ResponseEntity/ResponsePack.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Common/ResponseEntity/UserLoginRes.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Common/ResponseEntity/UserRegisterReqDto.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Common/SendDataToServer.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Common/Room.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Common/DeviceUI.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Common/SceneUI.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Common/SceneTargetDeviceUI.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Common/SceneRoomUI.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Common/ResponseEntity/AuthUserRes.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserView/UserPage.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserView/HomePage.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserView/UserHomeView.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/HdlBackup/HdlBackupListForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/HdlBackup/HdlGatewayBackUpForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/HdlBackup/HdlGatewayListBackUpForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Residence/LookRoomDeviceListForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Residence/FloorListRoomForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Residence/LookRoomSettionForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Residence/ResidenceListForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Residence/AddNewRoomForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Residence/EditorRoomInforForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Residence/ResidenceManagementForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Password/CheckOldPhoneForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Password/EditorGesturePasswordForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Password/ForgotSecondaryPasswordForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Password/CheckNewPhoneForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Password/ResetAccountPasswordForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Password/CheckOldEmailForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Password/EditorAccountPasswordForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Password/ForgotAccountPasswordForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Password/CheckNewEmailForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Password/EditorSecondaryPasswordForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Suggestion/FeedbackForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Member/AddMemberSuccessForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Member/AddMemberByIdForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Member/MemberNotEsixtForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Member/AddMemberInfoForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Member/MemberManagementForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Member/SubAccountLevelUpSuccessForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Member/MemberListForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/SharedContent/LookSharedContentForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/SharedContent/LookSharedListRoomForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/SharedContent/AddNewSharedListRoomForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/SharedContent/AddNewSharedContentForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Safety/AlarmTargetAddMenuForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Safety/GarrisonAreaSettionMenuForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Safety/GarrisonAreaDelayedSettionForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Safety/CoercePswEditorForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Safety/PasswordListUserForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Safety/AlarmTargetStatuSelectSwitchForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Safety/GarrisonAreaListMenuForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Safety/AlarmTargetExistSettionForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Safety/SafetyManagementMainForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Safety/PasswordAddNewForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Safety/AlarmTargetAddSceneForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Safety/CoercePswAddContactForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Safety/GarrisonAreaExistSensorForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Safety/PasswordMenuForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Safety/AlarmTargetAddDeviceForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Safety/AlarmTargetStatuSelectLightForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Safety/CoercePswAddNewForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Safety/AlarmTargetStatuSelectCurtainForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Safety/PasswordUserEditorForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/OtherParty/OtherPartyAccountMenuForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/DoorLock/UndistributeDoorlockUserPage.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/DoorLock/HistoryRecordPage.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/DoorLock/MemberManagement.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/DoorLock/EntryStatusPage.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/DoorLock/MemberFrozenPage.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/DoorLock/DoorLockCommonLayout.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/DoorLock/FunctionSetting.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/DoorLock/AddUnLockMethodTip.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/DoorLock/FunctionSettingSub.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/DoorLock/MasterManagementPage.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/DoorLock/UnLockMethod.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/DoorLock/TimeSettignPage.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/DoorLock/DoorlockDialog.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/DoorLock/UserDoorLockPage.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/DoorLock/UserManagement.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/DoorLock/AddUnLockMethod.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/DoorLock/TemporaryPassword.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/DoorLock/DoorLockCommonInfo.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Abount/AbountForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Device/DeviceAddSuccessForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Device/DeviceFirmwareUpdateForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Device/DeviceFunctionSettionForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Device/DeviceGeneralInformationForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Device/DeviceSearchForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Device/DeviceHistoryFirmwareVersionForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Device/DeviceDryContactSettionForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Device/DeviceFirmwareInfoForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Device/DeviceMacInfoEditorForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Device/DeviceListMainForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Device/Panel/PanelFunctionSettionForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Device/Panel/PanelButtonSettionForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Device/Panel/PanelBackLightSettionForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Device/Panel/PanelColorSelectForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Device/Curtain/AutoOpenDirectionAndLimitSettionForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Device/Curtain/SiphonateDirectionAndLimitSettionForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Device/PirSensor/PirSensorTargetSelectForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Device/PirSensor/PirSensorBindTargetSettionForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Device/DoorLock/DoorLockScreeningTypeForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Device/DoorLock/DoorLockHistoryLogForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Device/AirConditioner/IndoorUnitSettionForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Device/AirConditioner/AirConditionerModeForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Device/AirConditioner/IndoorUnitListForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Device/Direction/CurtainSiphonateDirectionForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Device/Direction/RelayThreeLoadDirectionForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Device/Direction/DimmableLightOneLoadDirectionForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Device/Direction/RepeaterZigbeeDirectionForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Device/Direction/SensorPirDirectionForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Device/Direction/AirConditionerZbGatewayDirectionForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Device/Direction/IntelligentLocksH06cDirectionForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Device/Direction/PanelThreeButtonDirectionForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Device/Direction/SensorWaterDirectionForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Device/Direction/SensorDoorWindowDirectionForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Device/Direction/AirSwitchCloudContrDirectionForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Device/Direction/AddDeviceTypeListForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Device/Direction/SensorInfraredDirectionForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Device/Direction/SensorCarbonMonoxideDirectionForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Device/Direction/PanelFourButtonDirectionForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Device/Direction/CurtainAutoOpenDirectionForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Device/Direction/PanelTwoButtonDirectionForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Device/Direction/SensorFireDirectionForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Device/Direction/CommonForm/DirectionCommonForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Device/Direction/Help/DeviceDirectionHelpForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Device/Relay/RelayThreeLoadBackLightSettionForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Device/Bind/AddScenePage.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Device/Bind/AddDevicePage.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Device/Bind/ChooseKeyModePage.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Device/Bind/BindTargetsPage.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Device/Bind/BindCommonLayout.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Device/Bind/BindInfo.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/UserMain/QRCodeForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/UserMain/UserInformationForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/UserMain/SecondAuthenticationForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/UserMain/UserMainForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Resourse/ControlCommonResourse.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Resourse/UserCenterResourse.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Resourse/GatewayResourse.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Resourse/FirmwareUpdateResourse.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Resourse/DirectoryFileNameResourse.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Form/PswSecondarySecurityForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Form/NumberPswInputDialogForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Form/BottomMenuSelectForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Form/SelectDeviceForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Form/PswGestureSecirityForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Form/BottomItemSelectForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Form/AreaCodeSelectForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Form/DialogInputForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Form/Base/CommonFormBase.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Form/Base/EditorCommonForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Form/Base/DialogCommonForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Logic/HdlSafeguardLogic.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Logic/HdlBackupLogic.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Logic/HdlFirmwareUpdateLogic.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Logic/HdlThreadLogic.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Logic/HdlDeviceUpdateLogic.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Logic/UserCenterLogic.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Logic/HdlAlarmsLogic.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Logic/HdlDeviceAttributeLogic.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Logic/HdlDeviceHardInfoLogic.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Logic/HdlGatewayReceiveLogic.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Logic/HdlShardLogic.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Logic/HdlLogLogic.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Logic/HdlDeviceImageInfoLogic.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Logic/HdlGatewayBackupLogic.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Logic/HdlDeviceCurtainLogic.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Logic/HdlWifiLogic.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Logic/HdlJiguangMsgPushLogic.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Logic/HdlAutoBackupLogic.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Logic/HdlDeviceBindLogic.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Logic/HdlDevicePirSensorLogic.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Logic/HdlCheckLogic.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Logic/HdlDeviceFixedAttributeLogic.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Logic/HdlGatewayUpdateLogic.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Logic/HdlDevicePanelLogic.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Logic/HdlDeviceAirConditionerLogic.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Logic/HdlGatewayLogic.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Common/IMessageCommon.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Common/UserCenterCommon.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Common/GatewayBackupEnum.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Common/UserCenterColor.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Common/UserCenterEnumCommon.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Common/AccountOption.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Controls/NormalControls/PicViewControl.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Controls/NormalControls/NormalViewControl.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Controls/NormalControls/BackViewControl.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Controls/NormalControls/IconViewControl.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Controls/NormalControls/InformationTipView.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Controls/NormalControls/MostRightIconControl.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Controls/NormalControls/DetailTitleControl.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Controls/NormalControls/TopLayoutTitleControl.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Controls/NormalControls/DateSelectControl.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Controls/NormalControls/LoadingControl.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Controls/TextInputControls/TextInputControl.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Controls/TextInputControls/TextInputExControl.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Controls/FrameLayoutControls/FrameCaptionViewControl.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Controls/FrameLayoutControls/FrameRowControl.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Controls/FrameLayoutControls/FrameCaptionInputControl.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Controls/FrameLayoutControls/FrameLayoutControl.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Controls/FrameLayoutControls/FrameListControl.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Controls/SceneControls/SceneSimpleSelectControl.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Controls/SceneControls/SceneRoomControl.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Controls/DeviceControls/DeviceInfoIconControl.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Controls/DeviceControls/GatewayRowControl.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Controls/DeviceControls/DeviceSelectControl.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Controls/DeviceControls/DeviceObjectControl.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Controls/DeviceControls/DeviceRoomControl.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Controls/RowLayoutControls/RowNewVersionTipView.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Controls/RowLayoutControls/RowLayoutControl.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Controls/RowLayoutControls/RowMostRightTextView.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Controls/ListViewLayoutControls/VerticalListControl.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Controls/ListViewLayoutControls/VerticalFrameControl.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Controls/ClickButtonControls/BottomClickButton.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Controls/ClickButtonControls/NormalClickButton.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Controls/CompoundControls/SafeguardLogControl.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Controls/CompoundControls/TopRightMenuControl.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Controls/CompoundControls/RoomDeviceGroupMenuControl.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Controls/CompoundControls/PswGestureInputControl.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Controls/CompoundControls/NormalSelectControl.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Controls/CompoundControls/CutPictureControl.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Controls/CompoundControls/VerificationCodeControl.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Controls/CompoundControls/DeviceInformationListControl.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Controls/CompoundControls/ProgressFormBar.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Controls/CompoundControls/PswNumberInputControl.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Controls/CompoundControls/MsgControls.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Controls/CompoundControls/BelongAreaControl.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Controls/CompoundControls/InformationEditorControl.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Controls/CompoundControls/SceneFunctionSwitchControl.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Controls/CompoundControls/SearchEditText.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Controls/CompoundControls/SafetyMasterControl.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Controls/CompoundControls/ProgressBar.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Controls/CompoundControls/SafetySensorStatuControl.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Controls/BaseCommonControl/Common/IconControlCommon.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Controls/BaseCommonControl/Common/ClickButtonCommon.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Controls/BaseCommonControl/Base/TextInputBase.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Controls/BaseCommonControl/Base/ButtonBase.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Gateway/Update/GatewayFirmwareUpdateForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Gateway/Update/GatewayCoordinatorInfoForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Gateway/Update/GatewayVirtualDriveInfoForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Gateway/Update/GatewayFirmwareInfoForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Gateway/Update/GatewayHistoryFirmwareVersionForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Gateway/Update/GatewayLinuxInfoForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Gateway/Add/WirelessUdpSelectNetworkForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Gateway/Add/NewGateWayMenuSelectForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Gateway/Add/WirelessApSelectNetworkForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Gateway/Add/WirelessApDirection3Form.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Gateway/Add/WirelessUdpSearchForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Gateway/Add/WirelessApDirection1Form.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Gateway/Add/WiredGatewaySearchForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Gateway/Add/WiredGatewayDirectionForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Gateway/Add/WirelessApDirection2Form.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Gateway/Add/WirelessUdpDirectionForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Gateway/Add/WirelessApSearchForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Gateway/Manage/GatewayInfoEditorForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Gateway/Manage/GatewayAddSuccessForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Gateway/Manage/GatewayListForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Gateway/Manage/GatewayProductInfoForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Gateway/Manage/GatewaySearchListForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Gateway/Manage/GatewayGeneralInformationForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Gateway/Manage/GatewayBackUpListForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Gateway/Manage/GatewayRebindForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Gateway/Manage/GatewayUploadAndDownLoadForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/ZigBee/IO/LocalFileUtils.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/ZigBee/Common/BigInteger.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/ZigBee/Common/OwnCodes.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/ZigBee/Common/Config.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/ZigBee/Common/Global.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/ZigBee/Common/CloudMqttResponsePack.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/ZigBee/Common/IStatus.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/ZigBee/Common/EncryptionService.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/ZigBee/Common/Application.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/ZigBee/Common/CommonInfo.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/ZigBee/Common/SendDataToGateway.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/ZigBee/Common/RemoteOperatorConsts.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/ZigBee/Common/SecuritySet.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/ZigBee/Device/ThirdPartyModuleUpgrade.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/ZigBee/Device/Safeguard.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/ZigBee/Device/LogicBase.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/ZigBee/Device/CommonDevice.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/ZigBee/Device/Scene.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/ZigBee/Device/Logic.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/ZigBee/Device/TemperatureSensor.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/ZigBee/Device/ZbGateway.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/ZigBee/Device/ZbGatewayData.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/ZigBee/Device/AC.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/ZigBee/Device/ThermostatObj.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/ZigBee/Device/Transverter.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/ZigBee/Device/Rollershade.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/ZigBee/Device/CurtainBase.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/ZigBee/Device/Repeater.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/ZigBee/Device/Enum.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/ZigBee/Device/BindObj.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/ZigBee/Device/AirSwitch.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/ZigBee/Device/Panel.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/ZigBee/Device/PIRSensor.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/ZigBee/Device/IASZone.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/ZigBee/Device/DeviceType.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/ZigBee/Device/DoorLock.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/ZigBee/Device/HDLbutton.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/ZigBee/Device/LigthtBase.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/ZigBee/Device/OTADevice.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/ZigBee/Device/ColorDimmableLight.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/ZigBee/Device/ToggleLight.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/ZigBee/Device/DimmableLight.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Room/UnallocatedRoom.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Room/EditRoom.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Room/RoomHumiditySetting.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Room/RoomManagement.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Room/AddRoomSelectPicByLocal.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Room/RoomTemperatureSetting.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Room/RoomShareSetting.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Room/RoomCommon.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/AC/ACControl.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/AC/ACControlBase.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Category/SelectDelayTime.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Category/CategorySceneSelectImgByLocal.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Category/SelectDevice.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Category/CategoryAddScene.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Category/SelectScene.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Category/SelectFloor.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Category/Category.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Curtain/RollerShadeControl.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Logic/Send.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Logic/EveryyearPage.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Logic/SelectedLogicState.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Logic/TemplatePage.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Logic/LogicMain.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Logic/SelectedLogicStatus.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Logic/AddScenePage.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Logic/LogicDevicePage.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Logic/SelectedLogic.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Logic/LogicCommunalPage.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Logic/MemberList.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Logic/Cycle.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Logic/TimePage.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Logic/EverymonthPage.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Logic/LogicIfon.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Logic/LogicListAutomation.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Logic/TemplateDeviceCondition.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Logic/DelayTime.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Logic/CyclicCycle.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Logic/AddLogicPage.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Logic/TimePoint.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Logic/DeviceStateCondition.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Logic/DeviceTarget.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Logic/LogicListPage.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Logic/TemplateDeviceAction.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Logic/IgnoreTime.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Logic/SelectedButton.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Logic/SecurityMode.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Logic/WeekPage.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Logic/CustomText.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Logic/DoorLockLogic/LockAddDevice.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Logic/DoorLockLogic/AddAction.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Logic/DoorLockLogic/LockLogicCommunalPage.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Logic/DoorLockLogic/LockAddScene.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Logic/DoorLockLogic/LockLogicList.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Logic/DoorLockLogic/AddCondition.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/CommonForm/SelectTime.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/CommonForm/Line.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/CommonForm/FunctionRow.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/CommonForm/SelectFunctionView.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/CommonForm/RoomNoNameMainView.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/CommonForm/DeviceInfoRow.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/CommonForm/TopFrameLayout.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/CommonForm/DeviceInfoWithZoneRow.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/CommonForm/CategoryFunctionForWinRow.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/CommonForm/CompleteButton.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/CommonForm/CommonFormResouce.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/CommonForm/SelectedStatuButton.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/CommonForm/SceneTargetTimeRow.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/CommonForm/RowLayoutEditButton.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/CommonForm/CustomAlert.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/CommonForm/LeftIconButtonRow.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/CommonForm/BackButton.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/CommonForm/DeviceIconSelectedIMGByLocal.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/CommonForm/SelectSceneStatuRow.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/CommonForm/SceneMainView.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/CommonForm/SelectDeviceWithSeekBarRow.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/CommonForm/FunctionButton.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/CommonForm/FunctionIconButton.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/CommonForm/ACLeftIconButtonRowLayout.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/CommonForm/ButtonLineForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/CommonForm/SelectZone.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/CommonForm/SelectDeviceWithPickViewRow.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/CommonForm/DeviceInfoEditRow.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/CommonForm/DeviceDetailInfo.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/CommonForm/CommonEnum.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/CommonForm/RowLayoutDeleteButton.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/CommonForm/FunctionMainView.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/CommonForm/SelectSceneRow.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/CommonForm/RoomMainView.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/CommonForm/CategoryFunctionRow.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/CommonForm/SceneTargetFunctionRow.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Light/AirSwitchControl.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Light/OnOffControl.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Light/LightControl.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Light/PlugControl.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Light/DimmableLightControl.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Account/AccountForgetPWD.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Account/AccountRegister.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Account/PhoneZone.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Account/AccountRegisterSuccess.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Account/AccountLoginByCode.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Account/AccountResetPWDSuccess.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Account/PhoneEmailForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Account/AccountLogin.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserView/LoginLoading.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/CommonForm/SceneCategoryView.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/DeviceLogic/ReadDeviceAttributeLogic.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/DLL/MQTTnet.dll","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/DLL/Security.dll","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/DLL/Elian.iOS.dll","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/DLL/ZigBee.Droid.dll","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/DLL/Shared.Droid.dll","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/DLL/Newtonsoft.Json.dll","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/DLL/ZigBee.Ios.xml","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/DLL/ZigBee.Droid.xml","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/DLL/M2Mqtt.Net.dll","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/packages/Xamarin.Android.Support.Core.UI.25.4.0.1/proguard/proguard.txt"],"BuildActions":["Compile","Compile","Compile","None","None","None","None","AndroidResource","AndroidResource","AndroidResource","AndroidNativeLibrary","AndroidNativeLibrary","AndroidResource","AndroidResource","AndroidResource","AndroidResource","AndroidResource","AndroidResource","AndroidResource","AndroidResource","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","ProjectReference","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","None","None","None","None","None","None","None","None","None","ProguardConfiguration"],"Analyzers":[]}
{"Format":1,"ProjectReferences":[],"MetadataReferences":[{"FilePath":"/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/packages/BouncyCastle.Crypto.dll.1.8.1/lib/BouncyCastle.Crypto.dll","Aliases":[]},{"FilePath":"/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/DroidLib/bin/Debug/DroidLib.dll","Aliases":[]},{"FilePath":"/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/packages/FastAndroidCamera.2.0.0/lib/MonoAndroid403/FastAndroidCamera.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Java.Interop.dll","Aliases":[]},{"FilePath":"/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/DLL/M2Mqtt.Net.dll","Aliases":[]},{"FilePath":"/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/packages/Microsoft.AppCenter.Analytics.1.14.0/lib/MonoAndroid403/Microsoft.AppCenter.Analytics.Android.Bindings.dll","Aliases":[]},{"FilePath":"/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/packages/Microsoft.AppCenter.Analytics.1.14.0/lib/MonoAndroid403/Microsoft.AppCenter.Analytics.dll","Aliases":[]},{"FilePath":"/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/packages/Microsoft.AppCenter.1.14.0/lib/MonoAndroid403/Microsoft.AppCenter.Android.Bindings.dll","Aliases":[]},{"FilePath":"/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/packages/Microsoft.AppCenter.Crashes.1.14.0/lib/MonoAndroid403/Microsoft.AppCenter.Crashes.Android.Bindings.dll","Aliases":[]},{"FilePath":"/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/packages/Microsoft.AppCenter.Crashes.1.14.0/lib/MonoAndroid403/Microsoft.AppCenter.Crashes.dll","Aliases":[]},{"FilePath":"/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/packages/Microsoft.AppCenter.1.14.0/lib/MonoAndroid403/Microsoft.AppCenter.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v8.0/Mono.Android.dll","Aliases":[]},{"FilePath":"/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/packages/MQTTnet.2.4.0/lib/netstandard1.3/MQTTnet.Core.dll","Aliases":[]},{"FilePath":"/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/packages/MQTTnet.2.4.0/lib/netstandard1.3/MQTTnet.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/mscorlib.dll","Aliases":[]},{"FilePath":"/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/DLL/Newtonsoft.Json.dll","Aliases":[]},{"FilePath":"/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/DLL/Security.dll","Aliases":[]},{"FilePath":"/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/DLL/Android/Shared.Droid.dll","Aliases":[]},{"FilePath":"/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/DLL/Android/Shared.Droid.HDLWidget.dll","Aliases":[]},{"FilePath":"/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/DLL/Android/Shared.Droid.Smartrefresh.dll","Aliases":[]},{"FilePath":"/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/DLL/Android/Shared.Droid.TouchID.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/System.Core.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/System.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/System.IO.Compression.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/System.Net.Http.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Runtime.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/System.Web.Services.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/System.Xml.dll","Aliases":[]},{"FilePath":"/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/DLL/Android/Xamarin.Android.Arch.Core.Common.dll","Aliases":[]},{"FilePath":"/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/DLL/Android/Xamarin.Android.Arch.Lifecycle.Common.dll","Aliases":[]},{"FilePath":"/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/DLL/Android/Xamarin.Android.Arch.Lifecycle.Runtime.dll","Aliases":[]},{"FilePath":"/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/DLL/Android/Xamarin.Android.Support.Animated.Vector.Drawable.dll","Aliases":[]},{"FilePath":"/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/DLL/Android/Xamarin.Android.Support.Annotations.dll","Aliases":[]},{"FilePath":"/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/DLL/Android/Xamarin.Android.Support.Compat.dll","Aliases":[]},{"FilePath":"/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/DLL/Android/Xamarin.Android.Support.Core.UI.dll","Aliases":[]},{"FilePath":"/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/DLL/Android/Xamarin.Android.Support.Core.Utils.dll","Aliases":[]},{"FilePath":"/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/DLL/Android/Xamarin.Android.Support.Fragment.dll","Aliases":[]},{"FilePath":"/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/DLL/Android/Xamarin.Android.Support.Media.Compat.dll","Aliases":[]},{"FilePath":"/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/DLL/Android/Xamarin.Android.Support.v4.dll","Aliases":[]},{"FilePath":"/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/DLL/Android/Xamarin.Android.Support.v7.AppCompat.dll","Aliases":[]},{"FilePath":"/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/DLL/Android/Xamarin.Android.Support.v7.RecyclerView.dll","Aliases":[]},{"FilePath":"/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/DLL/Android/Xamarin.Android.Support.Vector.Drawable.dll","Aliases":[]},{"FilePath":"/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/packages/ZXing.Net.Mobile.2.4.1/lib/MonoAndroid71/ZXing.Net.Mobile.Core.dll","Aliases":[]},{"FilePath":"/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/packages/ZXing.Net.Mobile.2.4.1/lib/MonoAndroid71/zxing.portable.dll","Aliases":[]},{"FilePath":"/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/packages/ZXing.Net.Mobile.2.4.1/lib/MonoAndroid71/ZXingNetMobile.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Diagnostics.Contracts.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Diagnostics.FileVersionInfo.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Net.Security.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Xml.XPath.XDocument.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Net.WebSockets.Client.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.IO.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Dynamic.Runtime.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Runtime.Serialization.Xml.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Security.Principal.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Reflection.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Threading.ThreadPool.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Security.Cryptography.Cng.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.ComponentModel.EventBasedAsync.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Security.Cryptography.Encryption.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Runtime.CompilerServices.VisualC.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Threading.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Security.Cryptography.DeriveBytes.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/netstandard.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.IO.UnmanagedMemoryStream.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.ServiceModel.Http.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.IO.FileSystem.AccessControl.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Xml.XPath.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Xml.XmlDocument.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Xml.Xsl.Primitives.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Resources.Writer.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Console.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Net.Cache.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Net.Sockets.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Text.Encoding.Extensions.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Net.NetworkInformation.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Net.Utilities.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Security.Principal.Windows.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Security.Claims.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.ServiceModel.Primitives.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Security.Cryptography.Hashing.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.ComponentModel.Primitives.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.IO.FileSystem.DriveInfo.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Security.Cryptography.X509Certificates.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Reflection.Primitives.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Runtime.Numerics.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.IO.FileSystem.Watcher.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Diagnostics.TraceSource.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Reflection.Emit.Lightweight.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Text.Encoding.CodePages.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Linq.Expressions.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Threading.Timer.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Runtime.InteropServices.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.IO.Pipes.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Net.HttpListener.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Text.RegularExpressions.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Threading.Tasks.Parallel.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Collections.NonGeneric.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Collections.Concurrent.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Threading.Overlapped.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Security.Cryptography.Pkcs.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Runtime.Handles.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Data.SqlClient.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.ObjectModel.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Net.WebHeaderCollection.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Runtime.InteropServices.RuntimeInformation.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.ComponentModel.TypeConverter.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Net.Mail.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Threading.Tasks.Extensions.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Linq.Parallel.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Xml.XDocument.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Security.SecureString.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/Microsoft.Win32.Registry.AccessControl.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Security.Cryptography.RSA.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.ComponentModel.Annotations.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.IO.FileSystem.Primitives.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Security.Cryptography.Primitives.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.IO.Compression.ZipFile.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Runtime.InteropServices.WindowsRuntime.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Linq.Queryable.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Resources.ResourceManager.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Resources.Reader.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Collections.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Reflection.Emit.ILGeneration.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Data.Common.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Net.NameResolution.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.ComponentModel.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.ServiceProcess.ServiceController.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Security.Cryptography.Encryption.ECDiffieHellman.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Runtime.Loader.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.ServiceModel.Security.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Net.AuthenticationManager.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Xml.ReaderWriter.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Threading.Tasks.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Diagnostics.Tracing.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.AppContext.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Buffers.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Security.Cryptography.Encryption.ECDsa.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Security.Cryptography.Csp.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Diagnostics.TextWriterTraceListener.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Text.Encoding.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.IO.MemoryMappedFiles.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Security.Cryptography.OpenSsl.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/Microsoft.Win32.Registry.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Globalization.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Security.Cryptography.RandomNumberGenerator.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Collections.Specialized.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Security.Cryptography.ProtectedData.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.ValueTuple.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Xml.XPath.XmlDocument.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Net.ServicePoint.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Xml.XmlSerializer.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Reflection.Extensions.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Globalization.Extensions.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Runtime.Extensions.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Resources.ReaderWriter.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Security.Cryptography.Encoding.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.IO.IsolatedStorage.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Threading.AccessControl.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.ServiceModel.NetTcp.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Security.AccessControl.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Reflection.TypeExtensions.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Globalization.Calendars.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Net.Requests.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Net.WebSockets.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Reflection.Emit.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.IO.FileSystem.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Runtime.Serialization.Json.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Security.Cryptography.Algorithms.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Threading.Thread.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Linq.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Diagnostics.Process.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Diagnostics.Tools.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Security.Cryptography.Hashing.Algorithms.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Diagnostics.Debug.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/Microsoft.Win32.Primitives.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Runtime.Serialization.Primitives.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Diagnostics.TraceEvent.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Drawing.Primitives.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Runtime.Serialization.Formatters.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Net.Ping.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.ServiceModel.Duplex.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Diagnostics.StackTrace.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Reflection.DispatchProxy.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Security.Cryptography.Encryption.Aes.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Memory.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Net.Primitives.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Drawing.Common.dll","Aliases":[]}],"Files":["/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Application.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Resources/Resource.designer.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Properties/AssemblyInfo.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/app.config","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/packages.config","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Resources/AboutResources.txt","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Properties/AndroidManifest.xml","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Resources/layout/Main.axml","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Resources/values/Strings.xml","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Resources/values/Styles.xml","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/libs/armeabi-v7a/libelianjni.so","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/libs/armeabi-v7a/libjcore127.so","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Resources/drawable/Loading.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Resources/mipmap-xxhdpi/Icon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Resources/mipmap-mdpi/Icon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Resources/mipmap-hdpi/Icon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Resources/mipmap-xhdpi/Icon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Resources/mipmap-xxxhdpi/Icon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Resources/drawable/Icon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Resources/xml/file_paths.xml","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Language.ini","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Account/Account.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Account/Cancle.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Account/Cat.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Account/ChangeSuccess.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Account/Code.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Account/HidePwd.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Account/Logo_loginBG.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Account/Logo_White.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Account/Password.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Account/PhoneEmail_White.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Account/UnhidePwd.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/AC/Add.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/AC/Fan_Height.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/AC/Fan_HeightSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/AC/Fan_Low.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/AC/Fan_LowSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/AC/Fan_Middle.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/AC/Fan_MiddleSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/AC/Group.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/AC/Mode_Auto.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/AC/Mode_AutoSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/AC/Mode_Cool.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/AC/Mode_CoolSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/AC/Mode_Dry.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/AC/Mode_DrySelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/AC/Mode_Fan.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/AC/Mode_FanSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/AC/Mode_Heat.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/AC/Mode_HeatSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/AC/OpenOrClose.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/AC/OpenOrCloseSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/AC/Path.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/AC/Reduce.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/AC/SelectedFanModeBG.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/AC/SelectedModeBG.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/BindPic/BindAdd.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/BindPic/BindDown.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/BindPic/BindEmptyPic.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/BindPic/BindLeft.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/BindPic/BindRight.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Center/Abount.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Center/Admin.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Center/Backup.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Center/DeviceManagement.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Center/ImperialCrown.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Center/MenberManagement.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Center/Opinion.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Center/ResidenceManagement.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Center/SafetyManagement.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Device/AirConditioner.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Device/AirConditionerEpoint.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Device/AirConditionerZbGateway.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Device/AirSwitch.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Device/AirSwitchCloudContr.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Device/ButtonPanel.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Device/ButtonPanelFour.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Device/ButtonPanelOne.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Device/ButtonPanelThree.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Device/ButtonPanelTwo.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Device/ColorLight.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Device/Converter.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Device/ConverterZb485.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Device/Curtain.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Device/CurtainAutoOpen.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Device/CurtainSiphonate.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Device/DimmableLight.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Device/DimmableLightOneLoad.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Device/DryContact.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Device/IntelligentLocks.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Device/IntelligentLocksH06C.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Device/Light.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Device/PanelTable.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Device/Relay.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Device/RelayEpoint.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Device/RelayThreeLoad.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Device/Repeater.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Device/Sensor.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Device/SensorCarbonMonoxide.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Device/SensorDoorWindow.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Device/SensorEmergencyButton.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Device/SensorFire.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Device/SensorHumidity.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Device/SensorInfrared.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Device/SensorMotion.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Device/SensorPir.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Device/SensorTemperature.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Device/SensorWater.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Device/Socket1.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Device/Switch.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/DoorLock/AddFailedPic.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/DoorLock/AddFingerprintTipPic.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/DoorLock/AddIcCardTipPic.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/DoorLock/AddIcon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/DoorLock/AddPasswordTicPic.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/DoorLock/AllMethod.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/DoorLock/AllMethodIcon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/DoorLock/AllMethodOn.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/DoorLock/CancelIcon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/DoorLock/DateIcon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/DoorLock/DelIcon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/DoorLock/DistributeUnlockIcon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/DoorLock/DooorLockPicOpen.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/DoorLock/DoorLockClose.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/DoorLock/DoorlockIcon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/DoorLock/DoorLockOpen.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/DoorLock/DoorLockPicClose.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/DoorLock/DoorlockPicture.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/DoorLock/DoorLockUserPic.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/DoorLock/EntrySuccessIcon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/DoorLock/FavoriteIcon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/DoorLock/Fingerprint.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/DoorLock/Fingerprint207.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/DoorLock/FingerprintOn.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/DoorLock/Left.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/DoorLock/MemberIcon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/DoorLock/Password.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/DoorLock/PasswordOn.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/DoorLock/proximityCard.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/DoorLock/proximityCardOn.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/DoorLock/RecordIcon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/DoorLock/RemoteUnlockIcon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/DoorLock/RightIcon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/DoorLock/RoomPic.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/DoorLock/SelectedIcon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/DoorLock/SettingIcon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/DoorLock/ShareIcon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/DoorLock/SideslipPic.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/DoorLock/Switch.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/DoorLock/SwitchOn.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/DoorLock/TemPasswordVisiable.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/DoorLock/TempPasswordBackground.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/DoorLock/TempPasswordBackground1.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/DoorLock/TypeIcon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/DoorLock/UndistributeIcon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/DoorLock/UnLockBlankPic.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/DoorLock/UnLockButton.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/DoorLock/UnlockFailed.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/DoorLock/UnLockSideslipIcon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/DoorLock/UnlockSuccess.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/DoorLock/UnselectedIcon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/DoorLock/VisitorIcon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Floor/Floor.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Floor/FloorSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/FunctionIcon/10Icon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/FunctionIcon/10IconSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/FunctionIcon/11Icon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/FunctionIcon/11IconSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/FunctionIcon/12Icon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/FunctionIcon/12IconSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/FunctionIcon/13Icon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/FunctionIcon/13IconSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/FunctionIcon/14Icon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/FunctionIcon/14IconSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/FunctionIcon/15Icon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/FunctionIcon/15IconSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/FunctionIcon/16Icon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/FunctionIcon/16IconSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/FunctionIcon/17Icon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/FunctionIcon/17IconSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/FunctionIcon/18Icon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/FunctionIcon/18IconSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/FunctionIcon/19Icon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/FunctionIcon/19IconSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/FunctionIcon/1Icon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/FunctionIcon/1IconSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/FunctionIcon/20Icon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/FunctionIcon/20IconSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/FunctionIcon/2Icon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/FunctionIcon/2IconSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/FunctionIcon/3Icon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/FunctionIcon/3IconSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/FunctionIcon/4Icon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/FunctionIcon/4IconSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/FunctionIcon/5Icon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/FunctionIcon/5IconSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/FunctionIcon/6Icon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/FunctionIcon/6IconSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/FunctionIcon/7Icon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/FunctionIcon/7IconSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/FunctionIcon/8Icon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/FunctionIcon/8IconSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/FunctionIcon/9Icon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/FunctionIcon/9IconSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Gateway/GatewayIcon1.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Gateway/GatewayIcon6.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Gateway/RealGateway1.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Gateway/RealGateway6.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Gateway/WiredGateway.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Gateway/WiredGatewayInstruct.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Instruct/DeviceSearch.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Instruct/DimmableLightOneLoad.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Instruct/IntelligentLocksH06C.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Instruct/PanelFourButton.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Instruct/PanelThreeButton.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Instruct/PanelTwoButton.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Instruct/RelayThreeLoad.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/Add.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/Add_Category.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/Add_GW.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/Back.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/BottomShadow.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/CancelIcon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/Category_FunctionBG.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/Category_FunctionBGSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/Check.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/CloseIcon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/Collection.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/Collection1.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/CollectionSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/CollectionSelected1.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/DateSearchIcon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/DeleteIcon1.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/DeleteIcon2.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/DeleteIcon2Selected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/Down.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/DownLoad.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/Drop_Down.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/FixedPosition.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/FixedPositionSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/Floor.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/ForgotPswList.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/FunctionCardView.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/FunctionCardViewSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/FunctionViewBG.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/GarrisonList.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/GarrisonListSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/HidenPWD.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/House.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/HouseSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/ItemSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/More.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/NewVersion.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/Next.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/NoBindGW.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/NoFunction.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/OpenIcon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/PersentIcon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/PickerColorWheel.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/Point.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/ProgressMsg.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/PswSettion.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/PswSettionSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/QRCode.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/Remote.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/ResidenceIcon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/RightIcon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/Room.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/RoomIcon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/SceneCard.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/SceneFunctionBG.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/ScreeningType.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/Search.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/SelectFloor_Left.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/SelectHouse.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/ShardMenu.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/Switch.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/Switch1.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/Switch2.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/Switch2Selected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/SwitchSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/SwitchSelected1.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/Time.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/Timer.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/Tips.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/UnHidenPWD.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/UnLockFail.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/UnLockSuccess.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/UpperTriangle.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/VirtualFrame.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/WrongIcon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Logo/Logo.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Navigation/Category.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Navigation/CategorySelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Navigation/Home.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Navigation/HomeSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Navigation/Setting.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Navigation/SettingSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/RealDevice/AirSwitchCloudContr.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/RealDevice/CommonDevice.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/RealDevice/CurtainAutoOpen.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/RealDevice/CurtainSiphonate.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/RealDevice/ButtonPanelFour.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/RealDevice/ButtonPanelFourNotPower.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/RealDevice/ButtonPanelThree.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/RealDevice/ButtonPanelTwo.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/RealDevice/SensorCarbonMonoxide.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/RealDevice/SensorDoorWindow.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/RealDevice/SensorEmergencyButton.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/RealDevice/SensorFire.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/RealDevice/SensorInfrared.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/RealDevice/SensorMotion.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/RealDevice/SensorPir.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/RealDevice/SensorWater.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Room/RoomCardView.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Room/RoomCardView_Name.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Room/Room_Rectangle.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Safeguard/ProtectionAtHome.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Safeguard/ProtectionAtHomeSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Safeguard/ProtectionRemoveHome.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Safeguard/ProtectionRemoveHomeSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Safeguard/WithdrawGarrison.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Safeguard/WithdrawGarrisonSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Account/Back.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Scene/Delaying.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/AC/AC_TIP.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/RoomIcon/0.JPG","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/RoomIcon/1.JPG","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/RoomIcon/2.JPG","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/RoomIcon/3.JPG","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/RoomIcon/4.JPG","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/RoomIcon/5.JPG","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/SceneIcon/0.jpg","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/SceneIcon/1.jpg","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/SceneIcon/2.jpg","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/SceneIcon/3.jpg","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/SceneIcon/4.jpg","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/SceneIcon/5.jpg","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/SceneIcon/6.jpg","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/SceneIcon/7.jpg","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/SceneIcon/8.jpg","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/SceneIcon/9.jpg","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Room/List.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Room/Humidity.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Room/Temperature.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/InputAccountIcon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/InputAccountIconSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/MemberNotEsixtPic.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/NotAuthority.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/NotShardPic.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/ScanQRcodeIcon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/ScanQRcodeIconSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/1.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/2.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/3.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/ac.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/add.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/AddSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/airswitch.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/athome.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/back.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/connect.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/curtain.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/Ddmmablelight.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/delay.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/delay1.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/deviceselectedbackgroundcolor.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/deviceunselectedbackgroundcolor.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/dimmableLight.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/doorlock.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/drop-down.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/dropdown.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/function.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/function1.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/humidity.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/iconBackgroundColor.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/iconSelectedBackgroundColor.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/leavehome.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/light.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/light_1.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/logicaddcolor.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/logicbj1.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/logicbj2.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/logicclose.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/logicopen.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/next.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/nodelay.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/nofunction.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/noon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/noscene.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/nosecurity.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/panel.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/point.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/position.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/scene.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/scene1.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/security.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/security1.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/selected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/selectedac.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/selectedairswitch.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/selectedcurtain.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/selecteddimmableLight.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/selecteddoorlock.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/selectedlight.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/selectedmonth.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/selectedpanel.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/selectedsenor.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/selectedsensor13.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/selectedsensor21.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/selectedsensor22.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/selectedsensor277.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/selectedsensor40.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/selectedsensor42.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/selectedsensor43.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/selectedsensor44.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/sensor13.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/sensor21.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/sensor22.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/sensor277.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/sensor40.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/sensor42.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/sensor43.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/sensor44.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/sign.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/sunrise.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/sunset.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/temperature.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/time.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/timeparagraph.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/timepoint.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/withdrawal.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/ItemUnSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Gateway/WiredGatewaySearching.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/BottomButtonGround.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/FailIcon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Light/DeskLamp.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Light/DeskLampSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/Message.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/MessageSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/MyHome.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/NextSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/SelectFloor_Right.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/Shared.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/RoomIconBackground.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/RoomIconBackgroundSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Room/FavoriteRoom.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Room/ItemSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Room/ItemUnSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Room/ItemUnSelected_Black.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Room/NoNameRoom.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/DoorLock/DelBackground.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/DoorLock/TemPasswordInvisiable.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/GwSwitchIcon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/GwSwitchIconSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Instruct/CurtainAutoOpen.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/DeviceLimitGround.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/DownTriangle.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/UpTriangle.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/DeviceLimitGroundSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Instruct/CurtainSiphonate.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Instruct/SensorInfrared.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Instruct/SensorDoorWindow.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Instruct/SensorCarbonMonoxide.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Instruct/SensorWater.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Instruct/AirSwitchCloudContr.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Instruct/RepeaterZigbee.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Instruct/AirConditionerZbGateway.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Device/RepeaterZigbee.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Instruct/SensorFire.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/lockadd.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/selectedhumidity.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/selectedtemperature.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/CreatFloor.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/CreatFloorSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/RoomIconSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Device/AirConditionerEpointSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/WarningIcon1.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/AC/Mode_Cool2.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/AC/Mode_Dry2.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/AC/Mode_Fan2.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/AC/Mode_Heat2.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/IndoorUnitGround.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/BindPic/BindRoomColor.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/BindPic/BindRoomColorOn.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Scene/SceneIcon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Scene/Selected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Safeguard/SafetyShortcut.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Safeguard/SafetyShortcutSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Device/ThirdPartyDevice.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Account/QQ.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Account/Wechat.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/HadAuthority.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Safeguard/SafeguardPasswordGround.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/PhoneBook.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/RollerShade/Close.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/RollerShade/CloseSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/RollerShade/Down.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/RollerShade/DownSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/RollerShade/Open.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/RollerShade/OpenSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/RollerShade/Stop.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/RollerShade/StopSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/RollerShade/Up.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/RollerShade/UpSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Gateway/AddGatewaySuccess.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Gateway/WirelessGatewaySearching.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/DroidLib/DroidLib.csproj","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Light/OFF.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Light/OFFSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Light/ON.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Light/OnOff.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Light/ONSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Light/Plug.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Light/PlugSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Gateway/WirelessApDirection.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Gateway/WirelessApGatewaySearching.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Gateway/WirelessGateway.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Loading/1.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Loading/10.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Loading/11.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Loading/12.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Loading/13.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Loading/14.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Loading/15.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Loading/16.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Loading/17.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Loading/18.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Loading/19.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Loading/2.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Loading/20.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Loading/21.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Loading/22.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Loading/23.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Loading/24.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Loading/25.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Loading/26.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Loading/27.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Loading/28.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Loading/29.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Loading/3.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Loading/30.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Loading/31.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Loading/32.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Loading/4.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Loading/5.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Loading/6.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Loading/7.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Loading/8.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Loading/9.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/AC/Swing_1.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/AC/Swing_1Selected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/AC/Swing_2.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/AC/Swing_2Selected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/AC/Swing_3.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/AC/Swing_3Selected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/AC/Swing_4.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/AC/Swing_4Selected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/AC/Swing_5.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/AC/Swing_5Selected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/AC/Swing_Auto.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/AC/Swing_AutoSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/AC/SwingBackground.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Common/ComparerDeviceUI.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Common/Device.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Common/House.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Common/Logic.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Common/ResponseEntity/ApkInfoOBJ.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Common/ResponseEntity/FirmwareManaRes.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Common/ResponseEntity/GetAppVersionCode.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Common/ResponseEntity/ResultPack.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Common/ResponseEntity/UserLoginLocalRegionRes.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Pad/MainPage.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/R.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Common/ZigbeeColor.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Common/CommonPage.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Common/ResultStatus.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Common/ResponseEntity/BackupInfoRes.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Common/ResponseEntity/FolderRes.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Common/ResponseEntity/GatewayRes.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Common/ResponseEntity/GetAreaCode.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Common/ResponseEntity/ResidenceRes.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Common/ResponseEntity/ResponsePack.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Common/ResponseEntity/UserLoginRes.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Common/ResponseEntity/UserRegisterReqDto.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Common/SendDataToServer.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Common/Room.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Common/DeviceUI.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Common/SceneUI.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Common/SceneTargetDeviceUI.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Common/SceneRoomUI.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Common/ResponseEntity/AuthUserRes.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserView/UserPage.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserView/HomePage.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserView/UserHomeView.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/HdlBackup/HdlBackupListForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/HdlBackup/HdlGatewayBackUpForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/HdlBackup/HdlGatewayListBackUpForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Residence/LookRoomDeviceListForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Residence/FloorListRoomForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Residence/LookRoomSettionForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Residence/ResidenceListForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Residence/AddNewRoomForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Residence/EditorRoomInforForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Residence/ResidenceManagementForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Password/CheckOldPhoneForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Password/EditorGesturePasswordForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Password/ForgotSecondaryPasswordForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Password/CheckNewPhoneForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Password/ResetAccountPasswordForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Password/CheckOldEmailForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Password/EditorAccountPasswordForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Password/ForgotAccountPasswordForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Password/CheckNewEmailForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Password/EditorSecondaryPasswordForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Suggestion/FeedbackForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Member/AddMemberSuccessForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Member/AddMemberByIdForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Member/MemberNotEsixtForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Member/AddMemberInfoForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Member/MemberManagementForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Member/SubAccountLevelUpSuccessForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Member/MemberListForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/SharedContent/LookSharedContentForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/SharedContent/LookSharedListRoomForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/SharedContent/AddNewSharedListRoomForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/SharedContent/AddNewSharedContentForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Safety/AlarmTargetAddMenuForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Safety/GarrisonAreaSettionMenuForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Safety/GarrisonAreaDelayedSettionForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Safety/CoercePswEditorForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Safety/PasswordListUserForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Safety/AlarmTargetStatuSelectSwitchForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Safety/GarrisonAreaListMenuForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Safety/AlarmTargetExistSettionForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Safety/SafetyManagementMainForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Safety/PasswordAddNewForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Safety/AlarmTargetAddSceneForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Safety/CoercePswAddContactForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Safety/GarrisonAreaExistSensorForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Safety/PasswordMenuForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Safety/AlarmTargetAddDeviceForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Safety/AlarmTargetStatuSelectLightForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Safety/CoercePswAddNewForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Safety/AlarmTargetStatuSelectCurtainForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Safety/PasswordUserEditorForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/OtherParty/OtherPartyAccountMenuForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/DoorLock/UndistributeDoorlockUserPage.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/DoorLock/HistoryRecordPage.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/DoorLock/MemberManagement.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/DoorLock/EntryStatusPage.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/DoorLock/MemberFrozenPage.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/DoorLock/DoorLockCommonLayout.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/DoorLock/FunctionSetting.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/DoorLock/AddUnLockMethodTip.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/DoorLock/FunctionSettingSub.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/DoorLock/MasterManagementPage.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/DoorLock/UnLockMethod.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/DoorLock/TimeSettignPage.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/DoorLock/DoorlockDialog.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/DoorLock/UserDoorLockPage.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/DoorLock/UserManagement.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/DoorLock/AddUnLockMethod.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/DoorLock/TemporaryPassword.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/DoorLock/DoorLockCommonInfo.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Abount/AbountForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Device/DeviceAddSuccessForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Device/DeviceFirmwareUpdateForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Device/DeviceFunctionSettionForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Device/DeviceGeneralInformationForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Device/DeviceSearchForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Device/DeviceHistoryFirmwareVersionForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Device/DeviceDryContactSettionForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Device/DeviceFirmwareInfoForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Device/DeviceMacInfoEditorForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Device/DeviceListMainForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Device/Panel/PanelFunctionSettionForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Device/Panel/PanelButtonSettionForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Device/Panel/PanelBackLightSettionForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Device/Panel/PanelColorSelectForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Device/Curtain/AutoOpenDirectionAndLimitSettionForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Device/Curtain/SiphonateDirectionAndLimitSettionForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Device/PirSensor/PirSensorTargetSelectForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Device/PirSensor/PirSensorBindTargetSettionForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Device/DoorLock/DoorLockScreeningTypeForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Device/DoorLock/DoorLockHistoryLogForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Device/AirConditioner/IndoorUnitSettionForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Device/AirConditioner/AirConditionerModeForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Device/AirConditioner/IndoorUnitListForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Device/Direction/CurtainSiphonateDirectionForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Device/Direction/RelayThreeLoadDirectionForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Device/Direction/DimmableLightOneLoadDirectionForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Device/Direction/RepeaterZigbeeDirectionForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Device/Direction/SensorPirDirectionForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Device/Direction/AirConditionerZbGatewayDirectionForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Device/Direction/IntelligentLocksH06cDirectionForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Device/Direction/PanelThreeButtonDirectionForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Device/Direction/SensorWaterDirectionForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Device/Direction/SensorDoorWindowDirectionForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Device/Direction/AirSwitchCloudContrDirectionForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Device/Direction/AddDeviceTypeListForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Device/Direction/SensorInfraredDirectionForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Device/Direction/SensorCarbonMonoxideDirectionForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Device/Direction/PanelFourButtonDirectionForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Device/Direction/CurtainAutoOpenDirectionForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Device/Direction/PanelTwoButtonDirectionForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Device/Direction/SensorFireDirectionForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Device/Direction/CommonForm/DirectionCommonForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Device/Direction/Help/DeviceDirectionHelpForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Device/Relay/RelayThreeLoadBackLightSettionForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Device/Bind/AddScenePage.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Device/Bind/AddDevicePage.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Device/Bind/ChooseKeyModePage.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Device/Bind/BindTargetsPage.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Device/Bind/BindCommonLayout.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Device/Bind/BindInfo.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/UserMain/QRCodeForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/UserMain/UserInformationForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/UserMain/SecondAuthenticationForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/UserMain/UserMainForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Resourse/ControlCommonResourse.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Resourse/UserCenterResourse.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Resourse/GatewayResourse.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Resourse/FirmwareUpdateResourse.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Resourse/DirectoryFileNameResourse.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Form/PswSecondarySecurityForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Form/NumberPswInputDialogForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Form/BottomMenuSelectForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Form/SelectDeviceForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Form/PswGestureSecirityForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Form/BottomItemSelectForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Form/AreaCodeSelectForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Form/DialogInputForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Form/Base/CommonFormBase.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Form/Base/EditorCommonForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Form/Base/DialogCommonForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Logic/HdlSafeguardLogic.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Logic/HdlBackupLogic.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Logic/HdlFirmwareUpdateLogic.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Logic/HdlThreadLogic.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Logic/HdlDeviceUpdateLogic.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Logic/UserCenterLogic.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Logic/HdlAlarmsLogic.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Logic/HdlDeviceAttributeLogic.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Logic/HdlDeviceHardInfoLogic.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Logic/HdlGatewayReceiveLogic.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Logic/HdlShardLogic.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Logic/HdlLogLogic.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Logic/HdlDeviceImageInfoLogic.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Logic/HdlGatewayBackupLogic.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Logic/HdlDeviceCurtainLogic.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Logic/HdlWifiLogic.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Logic/HdlJiguangMsgPushLogic.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Logic/HdlAutoBackupLogic.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Logic/HdlDeviceBindLogic.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Logic/HdlDevicePirSensorLogic.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Logic/HdlCheckLogic.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Logic/HdlDeviceFixedAttributeLogic.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Logic/HdlGatewayUpdateLogic.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Logic/HdlDevicePanelLogic.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Logic/HdlDeviceAirConditionerLogic.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Logic/HdlGatewayLogic.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Common/IMessageCommon.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Common/UserCenterCommon.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Common/GatewayBackupEnum.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Common/UserCenterColor.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Common/UserCenterEnumCommon.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Common/AccountOption.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Controls/NormalControls/PicViewControl.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Controls/NormalControls/NormalViewControl.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Controls/NormalControls/BackViewControl.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Controls/NormalControls/IconViewControl.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Controls/NormalControls/InformationTipView.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Controls/NormalControls/MostRightIconControl.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Controls/NormalControls/DetailTitleControl.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Controls/NormalControls/TopLayoutTitleControl.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Controls/NormalControls/DateSelectControl.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Controls/NormalControls/LoadingControl.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Controls/TextInputControls/TextInputControl.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Controls/TextInputControls/TextInputExControl.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Controls/FrameLayoutControls/FrameCaptionViewControl.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Controls/FrameLayoutControls/FrameRowControl.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Controls/FrameLayoutControls/FrameCaptionInputControl.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Controls/FrameLayoutControls/FrameLayoutControl.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Controls/FrameLayoutControls/FrameListControl.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Controls/SceneControls/SceneSimpleSelectControl.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Controls/SceneControls/SceneRoomControl.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Controls/DeviceControls/DeviceInfoIconControl.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Controls/DeviceControls/GatewayRowControl.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Controls/DeviceControls/DeviceSelectControl.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Controls/DeviceControls/DeviceObjectControl.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Controls/DeviceControls/DeviceRoomControl.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Controls/RowLayoutControls/RowNewVersionTipView.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Controls/RowLayoutControls/RowLayoutControl.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Controls/RowLayoutControls/RowMostRightTextView.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Controls/ListViewLayoutControls/VerticalListControl.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Controls/ListViewLayoutControls/VerticalFrameControl.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Controls/ClickButtonControls/BottomClickButton.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Controls/ClickButtonControls/NormalClickButton.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Controls/CompoundControls/SafeguardLogControl.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Controls/CompoundControls/TopRightMenuControl.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Controls/CompoundControls/RoomDeviceGroupMenuControl.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Controls/CompoundControls/PswGestureInputControl.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Controls/CompoundControls/NormalSelectControl.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Controls/CompoundControls/CutPictureControl.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Controls/CompoundControls/VerificationCodeControl.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Controls/CompoundControls/DeviceInformationListControl.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Controls/CompoundControls/ProgressFormBar.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Controls/CompoundControls/PswNumberInputControl.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Controls/CompoundControls/MsgControls.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Controls/CompoundControls/BelongAreaControl.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Controls/CompoundControls/InformationEditorControl.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Controls/CompoundControls/SceneFunctionSwitchControl.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Controls/CompoundControls/SearchEditText.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Controls/CompoundControls/SafetyMasterControl.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Controls/CompoundControls/ProgressBar.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Controls/CompoundControls/SafetySensorStatuControl.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Controls/BaseCommonControl/Common/IconControlCommon.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Controls/BaseCommonControl/Common/ClickButtonCommon.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Controls/BaseCommonControl/Base/TextInputBase.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Controls/BaseCommonControl/Base/ButtonBase.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Gateway/Update/GatewayFirmwareUpdateForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Gateway/Update/GatewayCoordinatorInfoForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Gateway/Update/GatewayVirtualDriveInfoForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Gateway/Update/GatewayFirmwareInfoForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Gateway/Update/GatewayHistoryFirmwareVersionForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Gateway/Update/GatewayLinuxInfoForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Gateway/Add/WirelessUdpSelectNetworkForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Gateway/Add/NewGateWayMenuSelectForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Gateway/Add/WirelessApSelectNetworkForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Gateway/Add/WirelessApDirection3Form.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Gateway/Add/WirelessUdpSearchForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Gateway/Add/WirelessApDirection1Form.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Gateway/Add/WiredGatewaySearchForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Gateway/Add/WiredGatewayDirectionForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Gateway/Add/WirelessApDirection2Form.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Gateway/Add/WirelessUdpDirectionForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Gateway/Add/WirelessApSearchForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Gateway/Manage/GatewayInfoEditorForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Gateway/Manage/GatewayAddSuccessForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Gateway/Manage/GatewayListForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Gateway/Manage/GatewayProductInfoForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Gateway/Manage/GatewaySearchListForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Gateway/Manage/GatewayGeneralInformationForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Gateway/Manage/GatewayBackUpListForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Gateway/Manage/GatewayRebindForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Gateway/Manage/GatewayUploadAndDownLoadForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/ZigBee/IO/LocalFileUtils.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/ZigBee/Common/BigInteger.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/ZigBee/Common/OwnCodes.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/ZigBee/Common/Config.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/ZigBee/Common/Global.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/ZigBee/Common/CloudMqttResponsePack.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/ZigBee/Common/IStatus.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/ZigBee/Common/EncryptionService.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/ZigBee/Common/Application.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/ZigBee/Common/CommonInfo.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/ZigBee/Common/SendDataToGateway.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/ZigBee/Common/RemoteOperatorConsts.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/ZigBee/Common/SecuritySet.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/ZigBee/Device/ThirdPartyModuleUpgrade.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/ZigBee/Device/Safeguard.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/ZigBee/Device/LogicBase.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/ZigBee/Device/CommonDevice.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/ZigBee/Device/Scene.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/ZigBee/Device/Logic.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/ZigBee/Device/TemperatureSensor.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/ZigBee/Device/ZbGateway.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/ZigBee/Device/ZbGatewayData.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/ZigBee/Device/AC.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/ZigBee/Device/ThermostatObj.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/ZigBee/Device/Transverter.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/ZigBee/Device/Rollershade.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/ZigBee/Device/CurtainBase.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/ZigBee/Device/Repeater.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/ZigBee/Device/Enum.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/ZigBee/Device/BindObj.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/ZigBee/Device/AirSwitch.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/ZigBee/Device/Panel.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/ZigBee/Device/PIRSensor.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/ZigBee/Device/IASZone.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/ZigBee/Device/DeviceType.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/ZigBee/Device/DoorLock.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/ZigBee/Device/HDLbutton.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/ZigBee/Device/LigthtBase.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/ZigBee/Device/OTADevice.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/ZigBee/Device/ColorDimmableLight.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/ZigBee/Device/ToggleLight.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/ZigBee/Device/DimmableLight.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Room/UnallocatedRoom.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Room/EditRoom.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Room/RoomHumiditySetting.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Room/RoomManagement.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Room/AddRoomSelectPicByLocal.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Room/RoomTemperatureSetting.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Room/RoomShareSetting.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Room/RoomCommon.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/AC/ACControl.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/AC/ACControlBase.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Category/SelectDelayTime.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Category/CategorySceneSelectImgByLocal.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Category/SelectDevice.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Category/CategoryAddScene.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Category/SelectScene.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Category/SelectFloor.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Category/Category.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Curtain/RollerShadeControl.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Logic/Send.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Logic/EveryyearPage.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Logic/SelectedLogicState.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Logic/TemplatePage.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Logic/LogicMain.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Logic/SelectedLogicStatus.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Logic/AddScenePage.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Logic/LogicDevicePage.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Logic/SelectedLogic.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Logic/LogicCommunalPage.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Logic/MemberList.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Logic/Cycle.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Logic/TimePage.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Logic/EverymonthPage.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Logic/LogicIfon.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Logic/LogicListAutomation.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Logic/TemplateDeviceCondition.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Logic/DelayTime.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Logic/CyclicCycle.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Logic/AddLogicPage.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Logic/TimePoint.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Logic/DeviceStateCondition.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Logic/DeviceTarget.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Logic/LogicListPage.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Logic/TemplateDeviceAction.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Logic/IgnoreTime.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Logic/SelectedButton.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Logic/SecurityMode.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Logic/WeekPage.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Logic/CustomText.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Logic/DoorLockLogic/LockAddDevice.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Logic/DoorLockLogic/AddAction.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Logic/DoorLockLogic/LockLogicCommunalPage.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Logic/DoorLockLogic/LockAddScene.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Logic/DoorLockLogic/LockLogicList.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Logic/DoorLockLogic/AddCondition.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/CommonForm/SelectTime.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/CommonForm/Line.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/CommonForm/FunctionRow.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/CommonForm/SelectFunctionView.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/CommonForm/RoomNoNameMainView.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/CommonForm/DeviceInfoRow.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/CommonForm/TopFrameLayout.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/CommonForm/DeviceInfoWithZoneRow.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/CommonForm/CategoryFunctionForWinRow.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/CommonForm/CompleteButton.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/CommonForm/CommonFormResouce.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/CommonForm/SelectedStatuButton.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/CommonForm/SceneTargetTimeRow.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/CommonForm/RowLayoutEditButton.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/CommonForm/CustomAlert.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/CommonForm/LeftIconButtonRow.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/CommonForm/BackButton.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/CommonForm/DeviceIconSelectedIMGByLocal.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/CommonForm/SelectSceneStatuRow.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/CommonForm/SceneMainView.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/CommonForm/SelectDeviceWithSeekBarRow.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/CommonForm/FunctionButton.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/CommonForm/FunctionIconButton.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/CommonForm/ACLeftIconButtonRowLayout.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/CommonForm/ButtonLineForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/CommonForm/SelectZone.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/CommonForm/SelectDeviceWithPickViewRow.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/CommonForm/DeviceInfoEditRow.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/CommonForm/DeviceDetailInfo.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/CommonForm/CommonEnum.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/CommonForm/RowLayoutDeleteButton.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/CommonForm/FunctionMainView.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/CommonForm/SelectSceneRow.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/CommonForm/RoomMainView.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/CommonForm/CategoryFunctionRow.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/CommonForm/SceneTargetFunctionRow.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Light/AirSwitchControl.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Light/OnOffControl.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Light/LightControl.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Light/PlugControl.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Light/DimmableLightControl.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Account/AccountForgetPWD.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Account/AccountRegister.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Account/PhoneZone.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Account/AccountRegisterSuccess.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Account/AccountLoginByCode.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Account/AccountResetPWDSuccess.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Account/PhoneEmailForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Account/AccountLogin.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserView/LoginLoading.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/CommonForm/SceneCategoryView.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/DeviceLogic/ReadDeviceAttributeLogic.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/DLL/MQTTnet.dll","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/DLL/Security.dll","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/DLL/Elian.iOS.dll","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/DLL/ZigBee.Droid.dll","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/DLL/Shared.Droid.dll","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/DLL/Newtonsoft.Json.dll","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/DLL/ZigBee.Ios.xml","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/DLL/ZigBee.Droid.xml","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/DLL/M2Mqtt.Net.dll","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/packages/Xamarin.Android.Support.Core.UI.25.4.0.1/proguard/proguard.txt"],"BuildActions":["Compile","Compile","Compile","None","None","None","None","AndroidResource","AndroidResource","AndroidResource","AndroidNativeLibrary","AndroidNativeLibrary","AndroidResource","AndroidResource","AndroidResource","AndroidResource","AndroidResource","AndroidResource","AndroidResource","AndroidResource","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","ProjectReference","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","None","None","None","None","None","None","None","None","None","ProguardConfiguration"],"Analyzers":[]}
ZigbeeApp/.vs/GateWay/xs/project-cache/Shared.Droid-Debug.json
@@ -1 +1 @@
{"Format":1,"ProjectReferences":[],"MetadataReferences":[{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Java.Interop.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v8.0/Mono.Android.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/mscorlib.dll","Aliases":[]},{"FilePath":"/Users/BruceLee/Desktop/HomeApp/ZigbeeApp/Shared/DLL/Newtonsoft.Json.dll","Aliases":[]},{"FilePath":"/Users/BruceLee/Desktop/HomeApp/ZigbeeApp/Shared/DLL/Shared.Droid.HDLWidget.dll","Aliases":[]},{"FilePath":"/Users/BruceLee/Desktop/HomeApp/ZigbeeApp/Shared/DLL/Shared.Droid.PickerView.dll","Aliases":[]},{"FilePath":"/Users/BruceLee/Desktop/HomeApp/ZigbeeApp/Shared/DLL/Shared.Droid.TouchID.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/System.Core.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/System.Data.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/System.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Runtime.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/System.Web.Services.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/System.Xml.dll","Aliases":[]},{"FilePath":"/Users/BruceLee/Desktop/HomeApp/ZigbeeApp/packages/Xamarin.Android.Arch.Core.Common.1.1.1.3/lib/monoandroid80/Xamarin.Android.Arch.Core.Common.dll","Aliases":[]},{"FilePath":"/Users/BruceLee/Desktop/HomeApp/ZigbeeApp/packages/Xamarin.Android.Arch.Lifecycle.Common.1.1.1.3/lib/monoandroid80/Xamarin.Android.Arch.Lifecycle.Common.dll","Aliases":[]},{"FilePath":"/Users/BruceLee/Desktop/HomeApp/ZigbeeApp/packages/Xamarin.Android.Arch.Lifecycle.Runtime.1.1.1.3/lib/monoandroid80/Xamarin.Android.Arch.Lifecycle.Runtime.dll","Aliases":[]},{"FilePath":"/Users/BruceLee/Desktop/HomeApp/ZigbeeApp/packages/Xamarin.Android.Support.Annotations.28.0.0.3/lib/monoandroid80/Xamarin.Android.Support.Annotations.dll","Aliases":[]},{"FilePath":"/Users/BruceLee/Desktop/HomeApp/ZigbeeApp/packages/Xamarin.Android.Support.Compat.28.0.0.3/lib/monoandroid80/Xamarin.Android.Support.Compat.dll","Aliases":[]},{"FilePath":"/Users/BruceLee/Desktop/HomeApp/ZigbeeApp/packages/Xamarin.Android.Support.Core.UI.28.0.0.3/lib/monoandroid80/Xamarin.Android.Support.Core.UI.dll","Aliases":[]},{"FilePath":"/Users/BruceLee/Desktop/HomeApp/ZigbeeApp/packages/Xamarin.Android.Support.Core.Utils.28.0.0.3/lib/monoandroid80/Xamarin.Android.Support.Core.Utils.dll","Aliases":[]},{"FilePath":"/Users/BruceLee/Desktop/HomeApp/ZigbeeApp/packages/Xamarin.Android.Support.Fragment.28.0.0.3/lib/monoandroid80/Xamarin.Android.Support.Fragment.dll","Aliases":[]},{"FilePath":"/Users/BruceLee/Desktop/HomeApp/ZigbeeApp/packages/Xamarin.Android.Support.Media.Compat.28.0.0.3/lib/monoandroid80/Xamarin.Android.Support.Media.Compat.dll","Aliases":[]},{"FilePath":"/Users/BruceLee/Desktop/HomeApp/ZigbeeApp/packages/Xamarin.Android.Support.v4.28.0.0.3/lib/monoandroid80/Xamarin.Android.Support.v4.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/Microsoft.Win32.Primitives.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/Microsoft.Win32.Registry.AccessControl.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/Microsoft.Win32.Registry.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/netstandard.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.AppContext.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Buffers.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Collections.Concurrent.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Collections.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Collections.NonGeneric.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Collections.Specialized.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.ComponentModel.Annotations.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.ComponentModel.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.ComponentModel.EventBasedAsync.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.ComponentModel.Primitives.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.ComponentModel.TypeConverter.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Console.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Data.Common.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Data.SqlClient.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Diagnostics.Contracts.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Diagnostics.Debug.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Diagnostics.FileVersionInfo.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Diagnostics.Process.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Diagnostics.StackTrace.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Diagnostics.TextWriterTraceListener.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Diagnostics.Tools.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Diagnostics.TraceEvent.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Diagnostics.TraceSource.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Diagnostics.Tracing.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Drawing.Common.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Drawing.Primitives.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Dynamic.Runtime.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Globalization.Calendars.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Globalization.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Globalization.Extensions.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.IO.Compression.ZipFile.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.IO.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.IO.FileSystem.AccessControl.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.IO.FileSystem.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.IO.FileSystem.DriveInfo.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.IO.FileSystem.Primitives.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.IO.FileSystem.Watcher.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.IO.IsolatedStorage.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.IO.MemoryMappedFiles.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.IO.Pipes.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.IO.UnmanagedMemoryStream.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Linq.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Linq.Expressions.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Linq.Parallel.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Linq.Queryable.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Memory.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Net.AuthenticationManager.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Net.Cache.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Net.HttpListener.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Net.Mail.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Net.NameResolution.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Net.NetworkInformation.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Net.Ping.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Net.Primitives.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Net.Requests.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Net.Security.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Net.ServicePoint.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Net.Sockets.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Net.Utilities.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Net.WebHeaderCollection.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Net.WebSockets.Client.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Net.WebSockets.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.ObjectModel.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Reflection.DispatchProxy.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Reflection.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Reflection.Emit.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Reflection.Emit.ILGeneration.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Reflection.Emit.Lightweight.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Reflection.Extensions.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Reflection.Primitives.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Reflection.TypeExtensions.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Resources.Reader.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Resources.ReaderWriter.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Resources.ResourceManager.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Resources.Writer.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Runtime.CompilerServices.VisualC.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Runtime.Extensions.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Runtime.Handles.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Runtime.InteropServices.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Runtime.InteropServices.RuntimeInformation.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Runtime.InteropServices.WindowsRuntime.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Runtime.Loader.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Runtime.Numerics.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Runtime.Serialization.Formatters.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Runtime.Serialization.Json.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Runtime.Serialization.Primitives.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Runtime.Serialization.Xml.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Security.AccessControl.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Security.Claims.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Security.Cryptography.Algorithms.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Security.Cryptography.Cng.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Security.Cryptography.Csp.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Security.Cryptography.DeriveBytes.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Security.Cryptography.Encoding.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Security.Cryptography.Encryption.Aes.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Security.Cryptography.Encryption.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Security.Cryptography.Encryption.ECDiffieHellman.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Security.Cryptography.Encryption.ECDsa.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Security.Cryptography.Hashing.Algorithms.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Security.Cryptography.Hashing.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Security.Cryptography.OpenSsl.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Security.Cryptography.Pkcs.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Security.Cryptography.Primitives.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Security.Cryptography.ProtectedData.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Security.Cryptography.RandomNumberGenerator.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Security.Cryptography.RSA.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Security.Cryptography.X509Certificates.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Security.Principal.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Security.Principal.Windows.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Security.SecureString.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.ServiceModel.Duplex.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.ServiceModel.Http.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.ServiceModel.NetTcp.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.ServiceModel.Primitives.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.ServiceModel.Security.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.ServiceProcess.ServiceController.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Text.Encoding.CodePages.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Text.Encoding.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Text.Encoding.Extensions.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Text.RegularExpressions.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Threading.AccessControl.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Threading.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Threading.Overlapped.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Threading.Tasks.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Threading.Tasks.Extensions.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Threading.Tasks.Parallel.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Threading.Thread.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Threading.ThreadPool.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Threading.Timer.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.ValueTuple.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Xml.ReaderWriter.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Xml.XDocument.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Xml.XmlDocument.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Xml.XmlSerializer.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Xml.XPath.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Xml.XPath.XDocument.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Xml.XPath.XmlDocument.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Xml.Xsl.Primitives.dll","Aliases":[]}],"Files":["/Users/BruceLee/Desktop/HomeApp/ZigbeeApp/Shared.Droid/Properties/AssemblyInfo.cs","/Users/BruceLee/Desktop/HomeApp/ZigbeeApp/Shared.Droid/IO/FileUtils.cs","/Users/BruceLee/Desktop/HomeApp/ZigbeeApp/Shared.Droid/Net/NetWiFi.cs","/Users/BruceLee/Desktop/HomeApp/ZigbeeApp/Shared.Droid/Other/DensityUtil.cs","/Users/BruceLee/Desktop/HomeApp/ZigbeeApp/Shared.Droid/UI/Alert.cs","/Users/BruceLee/Desktop/HomeApp/ZigbeeApp/Shared.Droid/UI/Application.cs","/Users/BruceLee/Desktop/HomeApp/ZigbeeApp/Shared.Droid/UI/Button.cs","/Users/BruceLee/Desktop/HomeApp/ZigbeeApp/Shared.Droid/UI/DateView.cs","/Users/BruceLee/Desktop/HomeApp/ZigbeeApp/Shared.Droid/UI/TimeView.cs","/Users/BruceLee/Desktop/HomeApp/ZigbeeApp/Shared.Droid/UI/Dialog.cs","/Users/BruceLee/Desktop/HomeApp/ZigbeeApp/Shared.Droid/UI/EditText.cs","/Users/BruceLee/Desktop/HomeApp/ZigbeeApp/Shared.Droid/UI/Enum.cs","/Users/BruceLee/Desktop/HomeApp/ZigbeeApp/Shared.Droid/UI/HorizontalScrolViewLayout.cs","/Users/BruceLee/Desktop/HomeApp/ZigbeeApp/Shared.Droid/UI/HorizontalSeekBar.cs","/Users/BruceLee/Desktop/HomeApp/ZigbeeApp/Shared.Droid/UI/Lanuage.cs","/Users/BruceLee/Desktop/HomeApp/ZigbeeApp/Shared.Droid/UI/Loading.cs","/Users/BruceLee/Desktop/HomeApp/ZigbeeApp/Shared.Droid/UI/PageLayout.cs","/Users/BruceLee/Desktop/HomeApp/ZigbeeApp/Shared.Droid/UI/RowLayout.cs","/Users/BruceLee/Desktop/HomeApp/ZigbeeApp/Shared.Droid/UI/Spinner.cs","/Users/BruceLee/Desktop/HomeApp/ZigbeeApp/Shared.Droid/UI/VerticalScrolViewLayout.cs","/Users/BruceLee/Desktop/HomeApp/ZigbeeApp/Shared.Droid/UI/VerticalSeekBar.cs","/Users/BruceLee/Desktop/HomeApp/ZigbeeApp/Shared.Droid/UI/Video.cs","/Users/BruceLee/Desktop/HomeApp/ZigbeeApp/Shared.Droid/UI/View.cs","/Users/BruceLee/Desktop/HomeApp/ZigbeeApp/Shared.Droid/UI/Tip.cs","/Users/BruceLee/Desktop/HomeApp/ZigbeeApp/Shared.Droid/UI/FrameLayout.cs","/Users/BruceLee/Desktop/HomeApp/ZigbeeApp/Shared.Droid/UI/ViewGroup.cs","/Users/BruceLee/Desktop/HomeApp/ZigbeeApp/Shared.Droid/UI/Camera.cs","/Users/BruceLee/Desktop/HomeApp/ZigbeeApp/Shared.Droid/UI/TextView.cs","/Users/BruceLee/Desktop/HomeApp/ZigbeeApp/Shared.Droid/UI/ColorPicker.cs","/Users/BruceLee/Desktop/HomeApp/ZigbeeApp/Shared.Droid/UI/UrlMonitor.cs","/Users/BruceLee/Desktop/HomeApp/ZigbeeApp/Shared.Droid/UI/MusicVerticalScrolViewLayout.cs","/Users/BruceLee/Desktop/HomeApp/ZigbeeApp/Shared.Droid/UI/SwipeLayout.cs","/Users/BruceLee/Desktop/HomeApp/ZigbeeApp/Shared.Droid/UI/ImageView.cs","/Users/BruceLee/Desktop/HomeApp/ZigbeeApp/Shared.Droid/UI/WiimuUPnp.cs","/Users/BruceLee/Desktop/HomeApp/ZigbeeApp/Shared.Droid/BaseActivity.cs","/Users/BruceLee/Desktop/HomeApp/ZigbeeApp/Shared.Droid/Other/Server.cs","/Users/BruceLee/Desktop/HomeApp/ZigbeeApp/Shared.Droid/Other/ServerHandler.cs","/Users/BruceLee/Desktop/HomeApp/ZigbeeApp/Shared.Droid/Other/MusicService.cs","/Users/BruceLee/Desktop/HomeApp/ZigbeeApp/Shared.Droid/Other/MusicInfo.cs","/Users/BruceLee/Desktop/HomeApp/ZigbeeApp/Shared.Droid/Other/Volume.cs","/Users/BruceLee/Desktop/HomeApp/ZigbeeApp/Shared.Droid/CommonClass.cs","/Users/BruceLee/Desktop/HomeApp/ZigbeeApp/Shared.Droid/MyBroadcastReceive.cs","/Users/BruceLee/Desktop/HomeApp/ZigbeeApp/Shared.Droid/Net/WifiUtil.cs","/Users/BruceLee/Desktop/HomeApp/ZigbeeApp/Shared.Droid/SplashActivity.cs","/Users/BruceLee/Desktop/HomeApp/ZigbeeApp/Shared.Droid/UI/MyEchartsView.cs","/Users/BruceLee/Desktop/HomeApp/ZigbeeApp/Shared.Droid/UI/PickerView.cs","/Users/BruceLee/Desktop/HomeApp/ZigbeeApp/Shared.Droid/UI/ArcSeekBar.cs","/Users/BruceLee/Desktop/HomeApp/ZigbeeApp/Shared.Droid/Utils/TouchIDUtils.cs","/Users/BruceLee/Desktop/HomeApp/ZigbeeApp/Shared.Droid/UI/WaveSeekBar.cs","/Users/BruceLee/Desktop/HomeApp/ZigbeeApp/Shared.Droid/Additions/AboutAdditions.txt","/Users/BruceLee/Desktop/HomeApp/ZigbeeApp/Shared.Droid/Jars/AboutJars.txt","/Users/BruceLee/Desktop/HomeApp/ZigbeeApp/Shared.Droid/packages.config","/Users/BruceLee/Desktop/HomeApp/ZigbeeApp/Shared.Droid/Transforms/EnumFields.xml","/Users/BruceLee/Desktop/HomeApp/ZigbeeApp/Shared.Droid/Transforms/EnumMethods.xml","/Users/BruceLee/Desktop/HomeApp/ZigbeeApp/Shared.Droid/Transforms/Metadata.xml","/Users/BruceLee/Desktop/HomeApp/ZigbeeApp/Shared.Droid/Jars/EzvizGlobalAPI.jar","/Users/BruceLee/Desktop/HomeApp/ZigbeeApp/Shared.Droid/Jars/MyJar.jar"],"BuildActions":["Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","None","None","None","TransformFile","TransformFile","TransformFile","EmbeddedJar","EmbeddedJar"],"Analyzers":[]}
{"Format":1,"ProjectReferences":[],"MetadataReferences":[{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Java.Interop.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v8.0/Mono.Android.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/mscorlib.dll","Aliases":[]},{"FilePath":"/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/DLL/Newtonsoft.Json.dll","Aliases":[]},{"FilePath":"/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/DLL/Android/Shared.Droid.HDLWidget.dll","Aliases":[]},{"FilePath":"/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/DLL/Android/Shared.Droid.Smartrefresh.dll","Aliases":[]},{"FilePath":"/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/DLL/Android/Shared.Droid.TouchID.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/System.Core.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/System.Data.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/System.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Runtime.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/System.Web.Services.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/System.Xml.dll","Aliases":[]},{"FilePath":"/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/DLL/Android/Xamarin.Android.Arch.Core.Common.dll","Aliases":[]},{"FilePath":"/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/DLL/Android/Xamarin.Android.Arch.Lifecycle.Common.dll","Aliases":[]},{"FilePath":"/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/DLL/Android/Xamarin.Android.Arch.Lifecycle.Runtime.dll","Aliases":[]},{"FilePath":"/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/DLL/Android/Xamarin.Android.Support.Animated.Vector.Drawable.dll","Aliases":[]},{"FilePath":"/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/DLL/Android/Xamarin.Android.Support.Annotations.dll","Aliases":[]},{"FilePath":"/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/DLL/Android/Xamarin.Android.Support.Compat.dll","Aliases":[]},{"FilePath":"/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/DLL/Android/Xamarin.Android.Support.Core.UI.dll","Aliases":[]},{"FilePath":"/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/DLL/Android/Xamarin.Android.Support.Core.Utils.dll","Aliases":[]},{"FilePath":"/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/DLL/Android/Xamarin.Android.Support.Fragment.dll","Aliases":[]},{"FilePath":"/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/DLL/Android/Xamarin.Android.Support.Media.Compat.dll","Aliases":[]},{"FilePath":"/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/DLL/Android/Xamarin.Android.Support.v4.dll","Aliases":[]},{"FilePath":"/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/DLL/Android/Xamarin.Android.Support.v7.AppCompat.dll","Aliases":[]},{"FilePath":"/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/DLL/Android/Xamarin.Android.Support.v7.RecyclerView.dll","Aliases":[]},{"FilePath":"/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/DLL/Android/Xamarin.Android.Support.Vector.Drawable.dll","Aliases":[]}],"Files":["/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared.Droid/Properties/AssemblyInfo.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared.Droid/IO/FileUtils.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared.Droid/Net/NetWiFi.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared.Droid/Other/DensityUtil.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared.Droid/UI/Alert.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared.Droid/UI/Application.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared.Droid/UI/Button.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared.Droid/UI/DateView.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared.Droid/UI/TimeView.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared.Droid/UI/Dialog.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared.Droid/UI/EditText.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared.Droid/UI/Enum.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared.Droid/UI/HorizontalScrolViewLayout.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared.Droid/UI/HorizontalSeekBar.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared.Droid/UI/Lanuage.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared.Droid/UI/Loading.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared.Droid/UI/PageLayout.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared.Droid/UI/RowLayout.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared.Droid/UI/Spinner.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared.Droid/UI/VerticalScrolViewLayout.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared.Droid/UI/VerticalSeekBar.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared.Droid/UI/Video.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared.Droid/UI/View.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared.Droid/UI/Tip.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared.Droid/UI/FrameLayout.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared.Droid/UI/ViewGroup.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared.Droid/UI/Camera.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared.Droid/UI/TextView.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared.Droid/UI/ColorPicker.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared.Droid/UI/UrlMonitor.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared.Droid/UI/MusicVerticalScrolViewLayout.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared.Droid/UI/SwipeLayout.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared.Droid/UI/ImageView.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared.Droid/UI/WiimuUPnp.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared.Droid/BaseActivity.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared.Droid/Other/Server.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared.Droid/Other/ServerHandler.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared.Droid/Other/MusicService.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared.Droid/Other/MusicInfo.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared.Droid/Other/Volume.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared.Droid/CommonClass.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared.Droid/MyBroadcastReceive.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared.Droid/Net/WifiUtil.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared.Droid/SplashActivity.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared.Droid/UI/MyEchartsView.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared.Droid/UI/PickerView.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared.Droid/UI/ArcSeekBar.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared.Droid/Utils/TouchIDUtils.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared.Droid/UI/WaveSeekBar.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared.Droid/UI/GDMapView.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared.Droid/Utils/HDLUtils.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared.Droid/UI/UIPickerView.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared.Droid/UI/UICoverFlowView.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared.Droid/UI/CropImage.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared.Droid/UI/UIDrawerLayout.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared.Droid/MyService.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared.Droid/UI/GestureLockView.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared.Droid/UI/QRCode.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared.Droid/UI/Contacts.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared.Droid/UI/VerticalRefreshLayout.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared.Droid/UI/CurtainSeekBar.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared.Droid/UI/CurtainRollSeekBar.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared.Droid/UI/ArcScaleSeekBar.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared.Droid/UI/EditTextView.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared.Droid/UI/HorizontalPages.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared.Droid/Additions/AboutAdditions.txt","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared.Droid/Jars/AboutJars.txt","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared.Droid/Transforms/EnumFields.xml","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared.Droid/Transforms/EnumMethods.xml","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared.Droid/Transforms/Metadata.xml","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared.Droid/Jars/EzvizGlobalAPI.jar","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared.Droid/Jars/MyJar.jar","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared.Droid/Jars/libammsdk.jar"],"BuildActions":["Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","None","None","TransformFile","TransformFile","TransformFile","EmbeddedJar","EmbeddedJar","EmbeddedJar"],"Analyzers":[]}
ZigbeeApp/.vs/GateWay/xs/sqlite3/storage.ide
Binary files differ
ZigbeeApp/GateWay.Droid/Assets/Phone/Room/Humidity.png
ZigbeeApp/GateWay.Droid/Assets/Phone/Room/List.png
ZigbeeApp/GateWay.Droid/Assets/Phone/Room/Temperature.png
ZigbeeApp/GateWay.Droid/GateWay.Droid.csproj
@@ -86,9 +86,6 @@
    <Reference Include="MQTTnet.Core, Version=2.4.0.0, Culture=neutral, processorArchitecture=MSIL">
      <HintPath>..\packages\MQTTnet.2.4.0\lib\netstandard1.3\MQTTnet.Core.dll</HintPath>
    </Reference>
    <Reference Include="Shared.Droid">
      <HintPath>..\Shared\DLL\Android\Shared.Droid.dll</HintPath>
    </Reference>
    <Reference Include="Shared.Droid.HDLWidget">
      <HintPath>..\Shared\DLL\Android\Shared.Droid.HDLWidget.dll</HintPath>
    </Reference>
@@ -190,6 +187,9 @@
    </Reference>
    <Reference Include="Xamarin.Android.Support.v7.RecyclerView">
      <HintPath>..\Shared\DLL\Android\Xamarin.Android.Support.v7.RecyclerView.dll</HintPath>
    </Reference>
    <Reference Include="Shared.Droid">
      <HintPath>..\Shared\DLL\Android\Shared.Droid.dll</HintPath>
    </Reference>
  </ItemGroup>
  <ItemGroup>
@@ -561,6 +561,9 @@
    <AndroidAsset Include="Assets\Phone\SceneIcon\7.jpg" />
    <AndroidAsset Include="Assets\Phone\SceneIcon\8.jpg" />
    <AndroidAsset Include="Assets\Phone\SceneIcon\9.jpg" />
    <AndroidAsset Include="Assets\Phone\Room\List.png" />
    <AndroidAsset Include="Assets\Phone\Room\Humidity.png" />
    <AndroidAsset Include="Assets\Phone\Room\Temperature.png" />
  </ItemGroup>
  <ItemGroup>
    <AndroidAsset Include="Assets\Phone\Item\InputAccountIcon.png" />
ZigbeeApp/Shared.Droid/Additions/AboutAdditions.txt
New file
@@ -0,0 +1,48 @@
Additions allow you to add arbitrary C# to the generated classes
before they are compiled.  This can be helpful for providing convenience
methods or adding pure C# classes.
== Adding Methods to Generated Classes ==
Let's say the library being bound has a Rectangle class with a constructor
that takes an x and y position, and a width and length size.  It will look like
this:
public partial class Rectangle
{
    public Rectangle (int x, int y, int width, int height)
    {
        // JNI bindings
    }
}
Imagine we want to add a constructor to this class that takes a Point and
Size structure instead of 4 ints.  We can add a new file called Rectangle.cs
with a partial class containing our new method:
public partial class Rectangle
{
    public Rectangle (Point location, Size size) :
        this (location.X, location.Y, size.Width, size.Height)
    {
    }
}
At compile time, the additions class will be added to the generated class
and the final assembly will a Rectangle class with both constructors.
== Adding C# Classes ==
Another thing that can be done is adding fully C# managed classes to the
generated library.  In the above example, let's assume that there isn't a
Point class available in Java or our library.  The one we create doesn't need
to interact with Java, so we'll create it like a normal class in C#.
By adding a Point.cs file with this class, it will end up in the binding library:
public class Point
{
    public int X { get; set; }
    public int Y { get; set; }
}
ZigbeeApp/Shared.Droid/BaseActivity.cs
New file
@@ -0,0 +1,871 @@
using System;
using Android.App;
using Android.Content;
using Android.Database;
using Android.Media;
using Android.Net.Wifi;
using Android.OS;
using Android.Util;
using Android.Widget;
using Java.Util;
using Android.Content.PM;
using Android.Locations;
using Android.Runtime;
using Android.Views;
using Com.Hdl.ON;
//using ICSharpCode.SharpZipLib.Zip;
using Android.Net;
using Android;
using System.Collections.Generic;
using System.Xml;
using Org.XmlPull.V1;
using Android.Support.V4.App;
using Android.Provider;
namespace Shared
{
    //[Activity(MainLauncher =true)]
    //public class BaseActivity1 : Android.App.Activity
    //{
    //    public static Action<BaseActivity1, Android.App.Application> OnCreateActoin;
    //    protected override void OnCreate (Android.OS.Bundle savedInstanceState)
    //    {
    //        base.OnCreate (savedInstanceState);
    //        var mainFrameLayout = new Android.Widget.FrameLayout (this) { KeepScreenOn = true };
    //        SetContentView (mainFrameLayout);
    //        if (OnCreateActoin != null) {
    //            OnCreateActoin (this, this.Application);
    //        }
    //    }
    //}
    //新的添加,可以解决切换语言后登陆问题。ConfigurationChanges= ConfigChanges.ScreenSize|ConfigChanges.Orientation| ConfigChanges.Keyboard| ConfigChanges.KeyboardHidden| ConfigChanges.Locale,
    [Activity (MainLauncher = true, WindowSoftInputMode = Android.Views.SoftInput.AdjustResize, LaunchMode = LaunchMode.SingleInstance, ConfigurationChanges = ConfigChanges.LayoutDirection | ConfigChanges.ScreenSize | ConfigChanges.Orientation | ConfigChanges.Keyboard | ConfigChanges.KeyboardHidden | ConfigChanges.Locale, Theme = "@style/MyTheme", ScreenOrientation = ScreenOrientation.Portrait)]
    public class BaseActivity : Android.App.Activity, ICommon, ViewTreeObserver.IOnGlobalLayoutListener
    {
        enum RequestCode
        {
            ActionLocationSourceSettings = 100,
        }
        WifiManager.MulticastLock multicasetLock;
        public static Action<BaseActivity> MonitorInfoChangedAction;
        public static Action<BaseActivity, Android.App.Application> OnCreateActoin;
        public static Action<BaseActivity> RefreshUIAction;
        public static Action<BaseActivity> OnResumeAction;
        /// <summary>
        /// ç½‘络状态变化
        /// </summary>
        public static Action<int> NetworkStateChanged;
        /// <summary>
        /// Activity é”€æŽ‰æ—¶äº‹ä»¶
        /// </summary>
        public static Action<BaseActivity> OnDestroyAction;
        Android.Widget.FrameLayout mainFrameLayout;
        DisplayMetrics metric = new DisplayMetrics ();
        /// <summary>
        /// Y轴坐标
        /// </summary>
        public static int TopMargin;
        public static bool IsHideVirualButtons;
        protected override void OnCreate (Android.OS.Bundle savedInstanceState)
        {
            try {
                System.Console.WriteLine($"Activity çº¿ç¨‹ID{System.Threading.Thread.CurrentThread.ManagedThreadId}");
                if (IsHideVirualButtons) {
                    MyJar.Common.HideVirtualButtons (this);
                }
                Shared.Application.Activity = this;
                if (Shared.Application.IsPad) {
                    this.RequestedOrientation = Android.Content.PM.ScreenOrientation.Landscape;
                }
                base.OnCreate (savedInstanceState);
                if (IsHideVirualButtons) {
                    WindowManager.DefaultDisplay.GetRealMetrics (metric);
                } else {
                    WindowManager.DefaultDisplay.GetMetrics (metric);
                }
                //获取设备的宽、高度
                Shared.Application.CurrentWidth = metric.WidthPixels;  //宽度(PX)
                                                                       //考虑到5.7寸屏往上偏移,加高父控件的高度
                Shared.Application.CurrentHeight = metric.HeightPixels - TopMargin;  //高度(PX
                //父控件
                var contentView = new Android.Widget.FrameLayout (this) ;
                mainFrameLayout = new Android.Widget.FrameLayout(this) { KeepScreenOn = KeepScreenON } ;
                contentView.AddView (mainFrameLayout, new Android.Widget.FrameLayout.LayoutParams (Shared.Application.CurrentWidth, Shared.Application.CurrentHeight) { TopMargin = TopMargin });
                SetContentView(contentView);
                //界面变化实现的接口
                Window.DecorView.ViewTreeObserver.AddOnGlobalLayoutListener (this);
                multicasetLock = WifiManager.FromContext (this).CreateMulticastLock ("WIFI");
                multicasetLock.Acquire ();
                initLanguage ();
                //启动本地音乐的后台服务
                StartService (new Intent (this, typeof (Other.MusicService)));
                SettingsContentObserver.RegisterVolumeChangeReceiver ();
                //注册广播
                registerReceiver ();
                com.hdl.on.Volume.Init ();
                OnCreateActoin?.Invoke (this, this.Application);
                //启动GPS后台服务
                StartService(new Intent(this, typeof(GPSLocationService)));
            } catch { }
        }
        public static bool KeepScreenON = true;
        public static bool IsEnnableGPS = true;
        #region å›¾åº“的权限
        Action<bool> imageAction;
        /// <summary>
        ///
        /// </summary>
        /// <param name="action">Action.</param>
        public void SetImagePermission(Action<bool> action)
        {
            imageAction = action;
            //如果还没有权限,得请求权限
            if (BuildVersionCodes.M <= Build.VERSION.SdkInt && (CheckSelfPermission(Manifest.Permission.WriteExternalStorage) == Permission.Denied || CheckSelfPermission(Manifest.Permission.ReadExternalStorage) == Permission.Denied))
            {
                RequestPermissions(new string[] { Manifest.Permission.WriteExternalStorage,Manifest.Permission.ReadExternalStorage }, 255);
            }
            else
            {
                //有权限直接回调出去
                if (imageAction != null)
                {
                    imageAction(true);
                    imageAction = null;
                }
            }
        }
        #endregion
        #region æ‘„像头功能
        Action<bool> cameraAction;
        /// <summary>
        ///
        /// </summary>
        /// <param name="action">Action.</param>
        public void SetCamera(Action<bool> action)
        {
            cameraAction = action;
            //如果还没有权限,得请求权限
            if (BuildVersionCodes.M <= Build.VERSION.SdkInt && CheckSelfPermission(Manifest.Permission.Camera) == Permission.Denied)
            {
                RequestPermissions(new string[] { Manifest.Permission.Camera }, 255);
            }
            else
            {
                //有权限直接回调出去
                if (cameraAction != null)
                {
                    cameraAction(true);
                    cameraAction = null;
                }
            }
        }
        #endregion
        #region èŽ·å–æ‰‹æœºçŠ¶æ€ä¿¡æ¯æƒé™
        Action<bool> readPhoneStateAction;
        /// <summary>
        /// è¤çŸ³æ‘„像头那块代码比较特殊,得在调用这个启动他需要的权限
        /// </summary>
        /// <param name="action">Action.</param>
        public void SetPhoneState(Action<bool> action)
        {
            readPhoneStateAction = action;
            //如果还没有权限,得请求权限
            if (BuildVersionCodes.M <= Build.VERSION.SdkInt && (CheckSelfPermission(Manifest.Permission.ReadPhoneState) == Permission.Denied || CheckSelfPermission(Manifest.Permission.CallPhone) == Permission.Denied || CheckSelfPermission(Manifest.Permission.ReadCallLog) == Permission.Denied || CheckSelfPermission(Manifest.Permission.WriteCallLog) == Permission.Denied || CheckSelfPermission(Manifest.Permission.AddVoicemail) == Permission.Denied || CheckSelfPermission(Manifest.Permission.UseSip) == Permission.Denied || CheckSelfPermission(Manifest.Permission.ProcessOutgoingCalls) == Permission.Denied)) {
                RequestPermissions(new string[] { Manifest.Permission.ReadPhoneState, Manifest.Permission.CallPhone, Manifest.Permission.ReadCallLog, Manifest.Permission.WriteCallLog, Manifest.Permission.AddVoicemail, Manifest.Permission.UseSip, Manifest.Permission.ProcessOutgoingCalls }, 255);
            } else {
                //有权限直接回调出去
                if (readPhoneStateAction != null) {
                    readPhoneStateAction(true);
                    readPhoneStateAction = null;
                }
            }
        }
        #endregion
        #region è¯»å†™è”系人信息
        Action<bool> readWriteContactAction;
        public void ReadWriteContact(Action<bool> action)
        {
            readWriteContactAction = action;
            if (BuildVersionCodes.M <= Android.OS.Build.VERSION.SdkInt && (CheckSelfPermission(Manifest.Permission.ReadContacts) == Permission.Denied || CheckSelfPermission(Manifest.Permission.WriteContacts) == Permission.Denied || CheckSelfPermission(Manifest.Permission.GetAccounts) == Permission.Denied))
            {
                RequestPermissions(new string[] { Android.Manifest.Permission.ReadContacts, Android.Manifest.Permission.WriteContacts, Manifest.Permission.GetAccounts }, 255);
            }
            else
            {
                //有权限直接回调出去
                readWriteContactAction?.Invoke(true);
                readWriteContactAction = null;
            }
        }
        #endregion
        #region å¯è§†å¯¹è®²çš„æƒé™
        Action<bool> audioRecordAction;
        public void AudioRecord(Action<bool> action)
        {
            audioRecordAction = action;
            if (BuildVersionCodes.M <= Android.OS.Build.VERSION.SdkInt && CheckSelfPermission(Manifest.Permission.RecordAudio) == Permission.Denied)
            {
                RequestPermissions(new string[] { Manifest.Permission.RecordAudio}, 255);
            }
            else
            {
                //有权限直接回调出去
                if (audioRecordAction != null)
                {
                    audioRecordAction(true);
                    audioRecordAction = null;
                }
            }
        }
        #endregion
        #region é€šç”¨æƒé™è¯·æ±‚
        Dictionary<int, Action<bool>> permissionLists = new Dictionary<int, Action<bool>> { };
        int maxCode = 10000;
        /// <summary>
        ///
        /// </summary>
        /// <param name="action">Action.</param>
        public void SetPermission(Action<bool> action,string permission)
        {
            //如果还没有权限,得请求权限
            if (CheckSelfPermission(permission) == Permission.Denied)
            {
                var code = maxCode++;
                permissionLists[code] = action;//根据请求的Code来确认请求的权限
                RequestPermissions(new string[] { permission }, code);
            }
            else
            {
                //有权限直接回调出去
                action?.Invoke(true);
            }
        }
        #endregion
        #region GPS的权限
        Action<bool> gpsLocationAction;
        /// <summary>
        ///
        /// </summary>
        /// <param name="action">Action.</param>
        public void SetGPSLocationPermission(Action<bool> action)
        {
            gpsLocationAction = action;
            //如果还没有权限,得请求权限
            if (BuildVersionCodes.M <= Build.VERSION.SdkInt && (CheckSelfPermission(Manifest.Permission.AccessFineLocation) == Permission.Denied || CheckSelfPermission(Manifest.Permission.AccessCoarseLocation) == Permission.Denied))
            {
                RequestPermissions(new string[] { Manifest.Permission.AccessFineLocation, Manifest.Permission.AccessCoarseLocation }, 255);
            }
            else
            {
                //有权限直接回调出去
                gpsLocationAction?.Invoke(true);
                gpsLocationAction = null;
            }
        }
        #endregion
        #region æ³¨å†Œå¹¿æ’­äº‹ä»¶
        MyBroadcastReceive myBroadcastReceive = new MyBroadcastReceive { };
        void registerReceiver ()
        {
            var intentFilter = new IntentFilter { };
            //监听电话状态变化
            intentFilter.AddAction ("android.intent.action.PHONE_STATE");
            intentFilter.AddAction ("android.intent.action.NEW_OUTGOING_CALL");
            //监听网络变化
            intentFilter.AddAction ("android.net.conn.CONNECTIVITY_CHANGE");
            intentFilter.AddAction ("android.intent.category.DEFAULT");
            //intentFilter.AddCategory
            RegisterReceiver (myBroadcastReceive, intentFilter);
            int beforeValue = 10;
            MyBroadcastReceive.ActionIdle = () => {
                var audioManager = (AudioManager)GetSystemService (AudioService);
                int nowValue = (int)(audioManager.GetStreamVolume (Stream.Music) * 100.0f / audioManager.GetStreamMaxVolume (Stream.Music));
                if (com.hdl.on.Volume.VolumeChange != null && beforeValue != nowValue) {
                    com.hdl.on.Volume.VolumeChange (beforeValue);
                }
            };
            MyBroadcastReceive.ActioRinging = () => {
                var audioManager = (AudioManager)GetSystemService (AudioService);
                beforeValue = (int)(audioManager.GetStreamVolume (Stream.Music) * 100.0f / audioManager.GetStreamMaxVolume (Stream.Music));
            };
        }
        #endregion
        Action<bool> contactsAction;
        /// <summary>
        ///
        /// </summary>
        /// <param name="action">Action.</param>
        public void SetContactsPermission(Action<bool> action)
        {
            contactsAction = action;
            //如果还没有权限,得请求权限
            if (BuildVersionCodes.M <= Build.VERSION.SdkInt && CheckSelfPermission(Manifest.Permission.ReadContacts) == Permission.Denied)
            {
                RequestPermissions(new string[] { Manifest.Permission.ReadContacts }, 254);
            }
            else
            {
                //有权限直接回调出去
                contactsAction?.Invoke(true);
                contactsAction = null;
            }
        }
        #region èŽ·å–é€šè®¯å½•
         //**版本判断。当手机系统大于 23 æ—¶ï¼Œæ‰æœ‰å¿…要去判断权限是否获取**
        #endregion
        public override void OnRequestPermissionsResult(int requestCode, string[] permissions, [GeneratedEnum] Permission[] grantResults)
        {
            base.OnRequestPermissionsResult(requestCode, permissions, grantResults);
            //根据Code来确认权限
            if (permissionLists.ContainsKey(requestCode))
            {
                var action = permissionLists[requestCode];
                permissionLists.Remove(requestCode);
                if (0 < grantResults.Length && grantResults[0] == Permission.Granted)
                {
                    action?.Invoke(true);
                }
                else {
                    action?.Invoke(false);
                }
            }
            //之前的写法,后面可以通过上面的方式处理,然后去掉这块代码
            for (int i = 0; i < permissions.Length; i++)
            {
                switch (permissions[i])
                {
                    case Manifest.Permission.AccessFineLocation:
                        if (grantResults[i] == Permission.Granted)
                        {
                            //有权限回调出去
                            gpsLocationAction?.Invoke(true);
                            gpsLocationAction = null;
                        }
                        break;
                    case Android.Manifest.Permission.ReadPhoneState:
                        if (readPhoneStateAction != null)
                        {
                            if (grantResults[i] == Permission.Granted)
                            {
                                readPhoneStateAction(true);
                            }
                            else
                            {
                                readPhoneStateAction(false);
                            }
                            readPhoneStateAction = null;
                        }
                        break;
                    case Manifest.Permission.ReadContacts:
                        if (requestCode == 254) {
                            if (grantResults[i] == Permission.Granted)
                            {
                                contactsAction?.Invoke(true);
                            }
                            else
                            {
                                contactsAction?.Invoke(false);
                            }
                            contactsAction = null;
                        }
                        if (requestCode == 255)
                        {
                            if (grantResults[i] == Permission.Granted)
                            {
                                readWriteContactAction?.Invoke(true);
                            }
                            else
                            {
                                readWriteContactAction?.Invoke(false);
                            }
                            readWriteContactAction = null;
                        }
                        break;
                    case Manifest.Permission.RecordAudio:
                        if (audioRecordAction != null)
                        {
                            if (grantResults[i] == Permission.Granted)
                            {
                                audioRecordAction(true);
                            }
                            else
                            {
                                audioRecordAction(false);
                            }
                            audioRecordAction = null;
                        }
                        break;
                    case Manifest.Permission.Camera:
                        if (cameraAction != null)
                        {
                            if (grantResults[i] == Permission.Granted)
                            {
                                cameraAction(true);
                            }
                            else
                            {
                                cameraAction(false);
                            }
                            cameraAction = null;
                        }
                        break;
                    case Manifest.Permission.WriteExternalStorage:
                        if (imageAction != null)
                        {
                            if (grantResults[i] == Permission.Granted)
                            {
                                imageAction(true);
                            }
                            else
                            {
                                imageAction(false);
                            }
                            imageAction = null;
                        }
                        break;
                }
            }
        }
        protected override void OnResume ()
        {
            base.OnResume ();
            OnResumeAction?.Invoke(this);
        }
        public override void OnWindowFocusChanged (bool hasFocus)
        {
            base.OnWindowFocusChanged (hasFocus);
            if (hasFocus && null == Shared.Application.RootFrameLayout) {
                initImages (() => {
                    mainFrameLayout.Post (() => {
                        Shared.Application.RootFrameLayout = mainFrameLayout;
                        RefreshUIAction?.Invoke(this);
                    });
                });
            }
        }
        /// <summary>
        ///  å®¡æ ¸æœ€åŽæ—¶é—´
        /// </summary>
        public static DateTime VerifyDateTime = DateTime.Now;
        public static Action BackKeyAction;
        public override bool DispatchKeyEvent (Android.Views.KeyEvent e)
        {
            //百度认证要求返回键有效果,加这个是为了审核通过
            //if (DateTime.Now < VerifyDateTime) {
            //    Console.WriteLine ("base VerifyDateTime");
            //    VerifyDateTime = DateTime.MinValue;
            //    //return base.DispatchKeyEvent (e);
            //}
            if (e.KeyCode == Android.Views.Keycode.Back && e.Action == Android.Views.KeyEventActions.Down) {
                BackKeyAction?.Invoke ();
            //    Console.WriteLine ("BackKeyAction End!!!");
            //    return true;
            }
            return base.DispatchKeyEvent (e);
        }
        public override bool OnKeyDown([GeneratedEnum] Keycode keyCode, KeyEvent e)
        {
            if(keyCode== Keycode.Back){
                //Console.WriteLine ("OnKeyDown1");
                //不允许结束程序,只是退出到后台
                if (VerifyDateTime == DateTime.MaxValue)
                {
                    //Console.WriteLine ("OnKeyDown2");
                    VerifyDateTime = DateTime.MinValue;
                    MoveTaskToBack (false);
                    //} else {
                    //Console.WriteLine ("OnKeyDown3");
                    //BackKeyAction ();
                    //return true;
                }
                return true;
            }
            return true;
            //return base.OnKeyDown(keyCode, e);
        }
        protected override void OnActivityResult(int requestCode, [GeneratedEnum] Result resultCode, Intent data)
        {
            base.OnActivityResult(requestCode, resultCode, data);
            if (requestCode == 0x30)
            {
                if (data == null) {
                    Shared.Contacts.ContactAction?.Invoke(null, null);
                }
                else
                {
                    string phoneNum = null;
                    string contactName = null;
                    // åˆ›å»ºå†…容解析者
                    var contentResolver = ContentResolver;
                    ICursor cursor = null;
                    if (data.Data != null)
                    {
                        cursor = contentResolver.Query(data.Data, new string[] { "display_name", "data1" }, null, null, null);
                    }
                    while (cursor.MoveToNext())
                    {
                        contactName = cursor.GetString(cursor.GetColumnIndex("display_name"));
                        phoneNum = cursor.GetString(cursor.GetColumnIndex("data1"));
                    }
                    cursor.Close();
                    //  æŠŠç”µè¯å·ç ä¸­çš„  -  ç¬¦å· æ›¿æ¢æˆç©ºæ ¼
                    if (phoneNum != null)
                    {
                        phoneNum = phoneNum.Replace("-", " ");
                        // ç©ºæ ¼åŽ»æŽ‰  ä¸ºä»€ä¹ˆä¸ç›´æŽ¥-替换成"" å› ä¸ºæµ‹è¯•的时候发现还是会有空格 åªèƒ½è¿™ä¹ˆå¤„理
                        phoneNum = phoneNum.Replace(" ", "");
                    }
                    Shared.Contacts.ContactAction?.Invoke(contactName, phoneNum);
                }
            }
        }
        protected override void OnDestroy ()
        {
            base.OnDestroy();
            OnDestroyAction?.Invoke(this);
            //关闭本地音乐提供的服务
            StopService (new Intent (this, typeof (Other.MusicService)));
            if (multicasetLock != null) {
                multicasetLock.Release ();
            }
            //移除手机状态广播
            UnregisterReceiver (myBroadcastReceive);
            SettingsContentObserver.UnregisterVolumeChangeReceiver ();
            //Android.OS.Process.KillProcess (Android.OS.Process.MyPid ());
        }
        void initLanguage ()
        {
            Locale l = Locale.Default;
            string language = l.Language;
            if ("zh" == language) {
                Language.CurrentLanguage = "Chinese";
            } else {
                Language.CurrentLanguage = "English";
            }
        }
        void writeFiles (string path)
        {
            //创建根目录
            System.IO.Directory.CreateDirectory (System.IO.Path.Combine (Shared.Application.RootPath, path));
            var paths = Assets.List (path);
            foreach (string fileOrFolderPath in paths) {
                var tempString = fileOrFolderPath.ToLower ();
                //系统自带的图
                if (tempString == "license" || tempString == "images" || tempString == "webkit") {
                    continue;
                }
                if (fileOrFolderPath.EndsWith (".zip")) {
                    //decomparessFile (fileOrFolderPath, Shared.IO.FileUtils.RootPath);
                    continue;
                }
                if (tempString.EndsWith (".txt") || tempString.EndsWith (".png") || tempString.EndsWith (".jpg")) {
                    System.IO.Stream inputStream = null;
                    try {
                        //根目录下如果直接是文件的就不需要复制
                        if (path != "") {
                            inputStream = this.Assets.Open (path + "/" + fileOrFolderPath);
                            //写当前文件
                            IO.FileUtils.WriteFileByInputStream (path + "/" + fileOrFolderPath, inputStream);
                        }
                    } catch { } finally {
                        if (inputStream != null) {
                            inputStream.Close ();
                        }
                    }
                } else {
                    if (path == "") {
                        writeFiles (fileOrFolderPath);
                    } else {
                        writeFiles (path + "/" + fileOrFolderPath);
                    }
                }
            }
        }
        void initImages (Action action)
        {
            var version = PackageManager.GetPackageInfo (Application.PackageName, 0).VersionCode;
            System.Threading.Tasks.Task.Run (() => {
                try {
                    var SharedPref = GetSharedPreferences ("PrivateData", Android.Content.FileCreationMode.Private);
                    //判断是否已经初始化图片成功,成功了就不在写
                    if (SharedPref.GetInt ("Version", -1) == version) {
                        return;
                    }
                    writeFiles ("");
                    //全部初始化后所有的信息后就创建这个文件来标记一下
                    var v = SharedPref.Edit ();
                    v.PutInt ("Version", version);
                    v.Apply ();
                    v.Commit ();
                } catch { } finally {
                    action ();
                }
            });
        }
        public static Action<MonitorData> ControlMonitorSceneAction;
        public void ControlMonitorScene (MonitorData p0)
        {
            ControlMonitorSceneAction?.Invoke(p0);
        }
        public static Action<string, string> MonitorMessagePushAction;
        public void MonitorMessagePush (string p0, string p1)
        {
            MonitorMessagePushAction?.Invoke(p0, p1);
        }
        public static Action<MonitorData> MonitorSceneDataAction;
        public void MonitorSceneData (MonitorData p0)
        {
            MonitorSceneDataAction?.Invoke(p0);
        }
        public void OnGlobalLayout()
        {
            var rect = new Android.Graphics.Rect();
            mainFrameLayout.GetWindowVisibleDisplayFrame(rect);
            var softHeight = metric.HeightPixels - (rect.Bottom - rect.Top);
            var tempHeight = EditText.FocusBottom + softHeight - metric.HeightPixels;
            //if (0 < tempHeight) {
            //    mainFrameLayout.SetY (-tempHeight - 10);
            //} else {
            //    mainFrameLayout.SetY (0);
            //}
            if (0 < tempHeight)
            {
                mainFrameLayout.SetY(TopMargin - tempHeight - 10);
            }
            else
            {
                mainFrameLayout.SetY(TopMargin);
            }
            //System.Console.WriteLine($"屏幕高度{mainFrameLayout.Height} è¾“入法高度{softHeight}");
            //当前已经是隐藏状态了
            //if(softHeight<=108){
            if (IsHideVirualButtons)
            {
                MyJar.Common.HideVirtualButtons(this);
            }
            //}
        }
        public void MoveToFront() {
            SystemHelper.SetTopApp(this.BaseContext);
        }
        ///// <summary>
        ///// è§£åŽ‹æ–‡ä»¶åˆ°æŒ‡å®šæ–‡ä»¶å¤¹
        ///// </summary>
        ///// <param name="sourceFile">压缩文件</param>
        ///// <param name="destinationDirectory">目标文件夹,如果为空则解压到当前文件夹下</param>
        ///// <param name="password">密码</param>
        ///// <returns></returns>
        //public bool decomparessFile (string filePath, string destinationDirectory, string password = null)
        //{
        //    bool result = false;
        //    var bufferSize = 1024;
        //    try {
        //        if (!System.IO.Directory.Exists (destinationDirectory)) {
        //            System.IO.Directory.CreateDirectory (destinationDirectory);
        //        }
        //        using (var zipStream = new ZipInputStream (Assets.Open (filePath))) {
        //            zipStream.Password = password;
        //            var zipEntry = zipStream.GetNextEntry ();
        //            while (zipEntry != null) {
        //                if (zipEntry.IsDirectory)//如果是文件夹则创建
        //                {
        //                    System.IO.Directory.CreateDirectory (System.IO.Path.Combine (destinationDirectory,
        //                                                                                 System.IO.Path.GetDirectoryName (zipEntry.Name)));
        //                } else {
        //                    string fileName = System.IO.Path.GetFileName (zipEntry.Name);
        //                    if (!string.IsNullOrEmpty (fileName) && fileName.Trim ().Length > 0) {
        //                        var fileItem = new System.IO.FileInfo (System.IO.Path.Combine (destinationDirectory, zipEntry.Name));
        //                        using (var writeStream = fileItem.Create ()) {
        //                            var buffer = new byte [bufferSize];
        //                            int readLength = 0;
        //                            do {
        //                                readLength = zipStream.Read (buffer, 0, bufferSize);
        //                                writeStream.Write (buffer, 0, readLength);
        //                            } while (readLength == bufferSize);
        //                            writeStream.Flush ();
        //                            writeStream.Close ();
        //                        }
        //                        fileItem.LastWriteTime = zipEntry.DateTime;
        //                    }
        //                }
        //                zipEntry = zipStream.GetNextEntry ();//获取下一个文件
        //            }
        //            zipStream.Close ();
        //        }
        //        result = true;
        //    } catch (System.Exception ex) {
        //        System.Console.WriteLine ($"文件解压发生错误:{ex}");
        //    }
        //    return result;
        //}
    }
    /// <summary>
    /// ç›‘听音量的变化
    /// </summary>
    class SettingsContentObserver : ContentObserver
    {
        static SettingsContentObserver settingsContentObserver;
        static Context context;
        public SettingsContentObserver(Context c, Handler handler) : base(handler)
        {
            context = c;
        }
        public override void OnChange(bool selfChange)
        {
            base.OnChange(selfChange);
            if(MyBroadcastReceive.IsCalling){
                return;
            }
            var audioManager = (AudioManager)context.GetSystemService(Context.AudioService);
            float currentVolume = audioManager.GetStreamVolume(Stream.Music) * 100.0f / audioManager.GetStreamMaxVolume(Stream.Music);
            if (com.hdl.on.Volume.VolumeChange != null)
            {
                System.Console.WriteLine ($"媒体音量变化Volume:{currentVolume}");
                com.hdl.on.Volume.VolumeChange((int)currentVolume);
            }
        }
        public static void RegisterVolumeChangeReceiver()
        {
            settingsContentObserver = new SettingsContentObserver(Shared.Application.Activity, new Handler());
            context.ContentResolver.RegisterContentObserver(Android.Provider.Settings.System.ContentUri, true, settingsContentObserver);
        }
        public static void UnregisterVolumeChangeReceiver()
        {
            context.ContentResolver.UnregisterContentObserver(settingsContentObserver);
        }
    }
    internal static class SystemHelper
    {
        /**
         * åˆ¤æ–­æœ¬åœ°æ˜¯å¦å·²ç»å®‰è£…好了指定的应用程序包
         *
         * @param packageNameTarget ï¼šå¾…判断的 App åŒ…名,如 å¾®åš com.sina.weibo
         * @return å·²å®‰è£…时返回 true,不存在时返回 false
         */
        public static bool AppIsExist(Context context, string packageNameTarget)
        {
            return true;
            //if ("" != packageNameTarget.Trim())
            //{
            //    PackageManager packageManager = context.PackageManager;
            //    var packageInfoList = packageManager.GetInstalledPackages(PackageInfoFlags.MatchUninstalledPackages);
            //    foreach (PackageInfo packageInfo in packageInfoList)
            //    {
            //        var packageNameSource = packageInfo.PackageName;
            //        if (packageNameSource == (packageNameTarget))
            //        {
            //            return true;
            //        }
            //    }
            //}
            //return false;
        }
        /**
         * å°†æœ¬åº”用置顶到最前端
         * å½“本应用位于后台时,则将它切换到最前端
         *
         * @param context
         */
        public static void SetTopApp(Context context)
        {
            if (!isRunningForeground(context))
            {
                /**获取ActivityManager*/
                var activityManager = (ActivityManager)context.GetSystemService(Activity.ActivityService);
                /**获得当前运行的task(任务)*/
                var taskInfoList = activityManager.GetRunningTasks(100);
                foreach (ActivityManager.RunningTaskInfo taskInfo in taskInfoList)
                {
                    /**找到本应用的 task,并将它切换到前台*/
                    if (taskInfo.TopActivity.PackageName == (context.PackageName))
                    {
                        activityManager.MoveTaskToFront(taskInfo.Id, 0);
                        break;
                    }
                }
            }
        }
        /**
         * åˆ¤æ–­æœ¬åº”用是否已经位于最前端
         *
         * @param context
         * @return æœ¬åº”用已经位于最前端时,返回 true;否则返回 false
         */
         static bool isRunningForeground(Context context)
        {
            var activityManager = (ActivityManager)context.GetSystemService(Activity.ActivityService);
            var appProcessInfoList = activityManager.RunningAppProcesses;
            /**枚举进程*/
            foreach (ActivityManager.RunningAppProcessInfo appProcessInfo in appProcessInfoList)
            {
                if (appProcessInfo.Importance == ActivityManager.RunningAppProcessInfo.ImportanceForeground)
                {
                    if (appProcessInfo.ProcessName == (context.ApplicationInfo.ProcessName))
                    {
                        return true;
                    }
                }
            }
            return false;
        }
    }
}
ZigbeeApp/Shared.Droid/Button.cs
New file
@@ -0,0 +1,353 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Android.App;
using Android.Content;
using Android.OS;
using Android.Runtime;
using Android.Views;
using Android.Widget;
using Android.Util;
using Android.Graphics;
using Android.Graphics.Drawables;
namespace Shared
{
    /// <summary>
    /// Button æŒ‰é”®
    /// </summary>
    public class Button : View
    {
        /// <summary>
        ///  å½“前视图
        /// </summary>
        /// <value>The android button.</value>
        AndroidButton currentButton
        {
            get
            {
                return androidView as AndroidButton;
            }
            set
            {
                this.androidView = value;
            }
        }
        public Button()
        {
             currentButton = new AndroidButton (Application.Activity);
             currentButton.SetTextColor (Android.Graphics.Color.White);
             currentButton.MouseDownEventHandler += (sender, e) => {
                OnMouseDown();
            };
             currentButton.MouseUPEventHandler += (sender, e) => {
                OnMouseUp();
            };
             currentButton.SizeChangeEventHandler+= (sender, e) => {
                OnSizeChange(e);
            };
        }
        /// <summary>
        /// æ–‡å­—大小
        /// </summary>
        /// <value>The size of the text.</value>
        public float TextSize
        {
            get
            {
                return currentButton.TextSize;
            }
            set
            {
                currentButton.SetTextSize(ComplexUnitType.Sp, value);
            }
        }
        int textID;
        /// <summary>
        /// æ ¹æ®ID获取对应的备注
        /// </summary>
        /// <value>The text I.</value>
        public int TextID
        {
            get
            {
                return textID;
            }
            set
            {
                textID = value;
                Text = Language.StringByID (TextID);
            }
        }
        /// <summary>
        /// æ–‡æœ¬
        /// </summary>
        /// <value>The text.</value>
        public string Text
        {
            get
            {
                return  currentButton.Text;
            }
            set
            {
                 currentButton.Text = value;
            }
        }
        /// <summary>
        /// åˆ·æ–°
        /// </summary>
        public override void Refresh()
        {
            base.Refresh ();
            IsSelected = isSelected;
        }
        private uint textColor;
        /// <summary>
        /// æ–‡å­—颜色
        /// </summary>
        /// <value>The color of the text.</value>
        public uint TextColor
        {
            get
            {
                return textColor;
            }
            set
            {
                textColor = value;
                byte r, g, b, a;
                r = (byte)(this.textColor / 256 / 256 % 256);
                g = (byte)(this.textColor / 256 % 256);
                b = (byte)(this.textColor % 256);
                a = (byte)(this.textColor / 256 / 256 / 256 % 256);
                currentButton.SetTextColor(Android.Graphics.Color.Argb(a, r, g, b));
            }
        }
        private bool isSelected;
        private string beforeImagePath;
        /// <summary>
        /// é€‰ä¸­çŠ¶æ€
        /// </summary>
        /// <value><c>true</c> if this instance is selected; otherwise, <c>false</c>.</value>
        public bool IsSelected
        {
            get
            {
                return this.isSelected;
            }
            set
            {
                this.isSelected = value;
                if (this.RealView.Parent == null || Radius != 0)
                {
                    return;
                }
                if (this.isSelected)
                {
                    if (beforeImagePath == this.SelectedImagePath)
                    {
                        return;
                    }
                    if (this.Background(this.SelectedImagePath))
                    {
                        beforeImagePath = this.SelectedImagePath;
                    }
                }
                else
                {
                    if (beforeImagePath == this.UnSelectedImagePath)
                    {
                        return;
                    }
                    if (this.Background(this.UnSelectedImagePath))
                    {
                        beforeImagePath = this.UnSelectedImagePath;
                    }
                }
            }
        }
        private TextAlignment textAlignment= TextAlignment.Center;
        /// <summary>
        /// æ–‡å­—对齐方式
        /// </summary>
        /// <param name="horizontalAlignment">Horizontal alignment.</param>
        /// <param name="verticalAlignment">Vertical alignment.</param>
        public TextAlignment TextAlignment {
            get {
                return this.textAlignment;
            }
            set {
                this.textAlignment = value;
                switch (value) {
                case TextAlignment.TopLeft:
                    this. currentButton.Gravity = GravityFlags.Top | GravityFlags.Left;
                    break;
                case TextAlignment.TopCenter:
                    this. currentButton.Gravity = GravityFlags.Top | GravityFlags.Center;
                    break;
                case TextAlignment.TopRight:
                    this. currentButton.Gravity = GravityFlags.Top | GravityFlags.Right;
                    break;
                case TextAlignment.CenterLeft:
                    this. currentButton.Gravity = GravityFlags.Center | GravityFlags.Left;
                    break;
                case TextAlignment.Center:
                    this. currentButton.Gravity = GravityFlags.Center | GravityFlags.Center;
                    break;
                case TextAlignment.CenterRight:
                    this. currentButton.Gravity = GravityFlags.Center | GravityFlags.Right;
                    break;
                case TextAlignment.BottomLeft:
                    this. currentButton.Gravity = GravityFlags.Bottom | GravityFlags.Left;
                    break;
                case TextAlignment.BottomCenter:
                    this. currentButton.Gravity = GravityFlags.Bottom | GravityFlags.Center;
                    break;
                case TextAlignment.BottomRight:
                    this. currentButton.Gravity = GravityFlags.Bottom | GravityFlags.Right;
                    break;
                }
            }
        }
        /// <summary>
        /// å†…边距
        /// </summary>
        /// <value>The padding.</value>
        public override Padding Padding {
            get {
                return new Padding (this. currentButton.PaddingTop, this. currentButton.PaddingLeft,this. currentButton.PaddingBottom, this. currentButton.PaddingRight);
            }
            set {
                //base.Padding = value;
                this. currentButton.SetPadding (DensityUtil.Dip2Px( value.Left),DensityUtil.Dip2Px( value.Top),DensityUtil.Dip2Px( value.Right),DensityUtil.Dip2Px( value.Bottom));
            }
        }
        private string selectedImagePath;
        /// <summary>
        /// é€‰æ‹©æ—¶èƒŒæ™¯å›¾è·¯å¾„
        /// </summary>
        /// <value>The selected image path.</value>
        public string SelectedImagePath
        {
            get
            {
                return this.selectedImagePath;
            }
            set{
                this.selectedImagePath = value;
                IsSelected = IsSelected;
            }
        }
        private string unSelectedImagePath;
        /// <summary>
        /// éžé€‰ä¸­çŠ¶æ€çš„èƒŒæ™¯å›¾è·¯å¾„
        /// </summary>
        /// <value>The un selected image path.</value>
        public string UnSelectedImagePath
        {
            get
            {
                return this.unSelectedImagePath;
            }
            set
            {
                this.unSelectedImagePath = value;
                IsSelected = IsSelected;
            }
        }
    }
    public class AndroidButton : Android.Widget.Button
    {
        public AndroidButton(Context context)
            : base(context)
        {
            this.SetBackgroundColor (Android.Graphics.Color.Transparent);
            this.SetPadding (0, 0, 0, 0);
        }
        public AndroidButton(Context context, IAttributeSet attrs)
            : base(context, attrs) { }
        protected AndroidButton(IntPtr javaReference, JniHandleOwnership transfer)
            : base(javaReference, transfer) { }
        public AndroidButton(Context context, IAttributeSet attrs, int defStyle)
            : base(context, attrs, defStyle) { }
        /// <summary>
        /// ç‚¹å‡»å¼¹èµ·äº‹ä»¶
        /// </summary>
        public  EventHandler MouseUPEventHandler;
        /// <summary>
        /// ç‚¹å‡»æŒ‰ä¸‹äº‹ä»¶
        /// </summary>
        public  EventHandler MouseDownEventHandler;
        /// <summary>
        /// ç‚¹å‡»äº‹ä»¶
        /// </summary>
        /// <returns>The touch event.</returns>
        /// <param name="e">E.</param>
        public override bool OnTouchEvent(Android.Views.MotionEvent e)
        {
            if (e.Action == Android.Views.MotionEventActions.Down && MouseDownEventHandler != null)
            {
                MouseDownEventHandler(this, EventArgs.Empty);
            }
            else if (e.Action == Android.Views.MotionEventActions.Up && MouseUPEventHandler != null)
            {
                MouseUPEventHandler(this, EventArgs.Empty);
            }
            return base.OnTouchEvent(e);
        }
        /// <summary>
        /// å¤§å°å˜åŒ–事件
        /// </summary>
        public  EventHandler<Size> SizeChangeEventHandler;
        public override ViewGroup.LayoutParams LayoutParameters
        {
            get
            {
                return base.LayoutParameters;
            }
            set
            {
                var layoutParams = base.LayoutParameters;
                base.LayoutParameters = value;
                if (layoutParams == null || layoutParams.Width != value.Width || layoutParams.Height != value.Height)
                {
                    if (this.SizeChangeEventHandler != null)
                    {
                        this.SizeChangeEventHandler(this, new Size((int)this.LayoutParameters.Width, (int)this.LayoutParameters.Height));
                    }
                }
            }
        }
    }
}
ZigbeeApp/Shared.Droid/CommonClass.cs
New file
@@ -0,0 +1,106 @@
using System;
using Android.Content;
using Android.OS;
namespace Shared
{
    public class CommonClass
    {
        /// <summary>
        /// æ‰“开应用
        /// </summary>
        /// <param name="packetName">包名</param>
        /// <param name="activityName"></param>
        public static void OpenApp(string packetName)
        {
            if (Application.Activity == null || packetName == null)
            {
                return;
            }
            if (!isAvilible(Application.Activity, packetName))
            {
                return;
            }
            var pi = Application.Activity.PackageManager.GetPackageInfo(packetName, 0);
            if (pi == null)
            {
                return;
            }
            var resolveIntent = new Intent(Intent.ActionMain, null);
            resolveIntent.AddCategory(Intent.CategoryLauncher);
            resolveIntent.SetPackage(pi.PackageName);
            var apps = Application.Activity.PackageManager.QueryIntentActivities(resolveIntent, 0);
            if (0 < apps.Count)
            {
                var ri = apps[0];
                string pkgName = ri.ActivityInfo.PackageName;
                string className = ri.ActivityInfo.Name;
                var intent = new Intent(Intent.ActionMain);
                intent.AddCategory(Intent.CategoryLauncher);
                //launchFlags:创建一个新的进程来运行这个Activity,也可以不需要,这样就是在当前APP内打开(同一个进程)
                intent.SetFlags(ActivityFlags.NewTask | ActivityFlags.ResetTaskIfNeeded);
                intent.SetAction("android.intent.action.VIEW");
                var cn = new ComponentName(pkgName, className);
                intent.SetComponent(cn);
                Application.Activity.StartActivity(intent);
            }
        }
        /**
* æ£€æŸ¥æ‰‹æœºä¸Šæ˜¯å¦å®‰è£…了指定的软件
* @param context
* @param packageName
* @return
*/
        public static bool isAvilible(Context context, string packageName)
        {
            var packageManager = context.PackageManager;
            var packageInfos = packageManager.GetInstalledPackages(0);
            var packageNames = new System.Collections.Generic.List<string>();
            if (packageInfos != null)
            {
                for (int i = 0; i < packageInfos.Count; i++)
                {
                    var packName = packageInfos[i].PackageName;
                    packageNames.Add(packName);
                }
            }
            // åˆ¤æ–­packageNames中是否有目标程序的包名,有TRUE,没有FALSE
            return packageNames.Contains(packageName);
        }
        /// <summary>
        /// æ‰“开界面
        /// </summary>
        /// <param name="action">Action.</param>
        public static void OpenAction(string action){
            try
            {
                Application.Activity.StartActivity(new Intent(action));
            }catch{}
        }
    }
}
//你好,经过测试,我们发现有两种方法都可以实现流媒体的播放。
//第一种:可以实现音乐推送播放,但体验效果很不好,因为获取音乐真实播放地址时间很长,实现思路如下:
//1、我们App先获取Token及时间
//2、然后用Tidal帐号直接登录airable服务器
//3、获取播放列表(不是真实的播放地址)
//4、根据播放列表去获取真实的播放地址(这里获取时间很长,每一首时间长的有五六秒都有可能)
//5、推送到播放器
//第二种:体验效果很好,但发送到播放的密码是加密的,需要算法。实现思路如下:
//1、我们App先获取Token及时间
//2、然后用Tidal帐号直接登录airable服务器并同时把用户名和密码告诉播放器
//3、获取播放列表(不是真实的播放地址,关键信息是ID)
//4、推送到播放列表到播放器
ZigbeeApp/Shared.Droid/Encryption/BASE64.cs
New file
@@ -0,0 +1,53 @@
using System;
using System.Collections.Generic;
using System.Text;
namespace Shared.Encryption
{
    public class BASE64
    {
        /// <summary>
        /// å°†å­—符串使用base64算法加密
        /// </summary>
        /// <param name="code">待加密的字符串</param>
        /// <returns>加密后的字符串</returns>
        public static string EncodeBase64(string code)
        {
            string encode = "";
            var bytes = Encoding.UTF8.GetBytes(code);  //将一组字符编码为一个字节序列.
            try
            {
                encode = Convert.ToBase64String(bytes);  //将8位无符号整数数组的子集转换为其等效的,以64为基的数字编码的字符串形式.
            }
            catch
            {
                encode = code;
            }
            return encode;
        }
        /// <summary>
        /// å°†å­—符串使用base64算法解密
        /// </summary>
        /// <param name="code">已用base64算法加密的字符串</param>
        /// <returns>解密后的字符串</returns>
        public static string DecodeBase64(string code)
        {
            string decode = "";
            try
            {
                var bytes = Convert.FromBase64String(code);  //将2进制编码转换为8位无符号整数数组.
                decode = Encoding.UTF8.GetString(bytes);  //将指定字节数组中的一个字节序列解码为一个字符串。
            }
            catch
            {
                decode = code;
            }
            return decode;
        }
    }
}
ZigbeeApp/Shared.Droid/Encryption/BigInteger.cs
New file
@@ -0,0 +1,3137 @@

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
namespace Shared.Encryption
{
    public class BigInteger
    {
        // maximum length of the BigInteger in uint (4 bytes)
        // change this to suit the required level of precision.
        private const int maxLength = 70;
        // primes smaller than 2000 to test the generated prime number
        public static readonly int[] primesBelow2000 = {
        2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97,
        101, 103, 107, 109, 113, 127, 131, 137, 139, 149, 151, 157, 163, 167, 173, 179, 181, 191, 193, 197, 199,
    211, 223, 227, 229, 233, 239, 241, 251, 257, 263, 269, 271, 277, 281, 283, 293,
    307, 311, 313, 317, 331, 337, 347, 349, 353, 359, 367, 373, 379, 383, 389, 397,
    401, 409, 419, 421, 431, 433, 439, 443, 449, 457, 461, 463, 467, 479, 487, 491, 499,
    503, 509, 521, 523, 541, 547, 557, 563, 569, 571, 577, 587, 593, 599,
    601, 607, 613, 617, 619, 631, 641, 643, 647, 653, 659, 661, 673, 677, 683, 691,
    701, 709, 719, 727, 733, 739, 743, 751, 757, 761, 769, 773, 787, 797,
    809, 811, 821, 823, 827, 829, 839, 853, 857, 859, 863, 877, 881, 883, 887,
    907, 911, 919, 929, 937, 941, 947, 953, 967, 971, 977, 983, 991, 997,
    1009, 1013, 1019, 1021, 1031, 1033, 1039, 1049, 1051, 1061, 1063, 1069, 1087, 1091, 1093, 1097,
    1103, 1109, 1117, 1123, 1129, 1151, 1153, 1163, 1171, 1181, 1187, 1193,
    1201, 1213, 1217, 1223, 1229, 1231, 1237, 1249, 1259, 1277, 1279, 1283, 1289, 1291, 1297,
    1301, 1303, 1307, 1319, 1321, 1327, 1361, 1367, 1373, 1381, 1399,
    1409, 1423, 1427, 1429, 1433, 1439, 1447, 1451, 1453, 1459, 1471, 1481, 1483, 1487, 1489, 1493, 1499,
    1511, 1523, 1531, 1543, 1549, 1553, 1559, 1567, 1571, 1579, 1583, 1597,
    1601, 1607, 1609, 1613, 1619, 1621, 1627, 1637, 1657, 1663, 1667, 1669, 1693, 1697, 1699,
    1709, 1721, 1723, 1733, 1741, 1747, 1753, 1759, 1777, 1783, 1787, 1789,
    1801, 1811, 1823, 1831, 1847, 1861, 1867, 1871, 1873, 1877, 1879, 1889,
    1901, 1907, 1913, 1931, 1933, 1949, 1951, 1973, 1979, 1987, 1993, 1997, 1999 };
        private uint[] data = null;             // stores bytes from the Big Integer
        public int dataLength;                 // number of actual chars used
        //***********************************************************************
        // Constructor (Default value for BigInteger is 0
        //***********************************************************************
        public BigInteger()
        {
            data = new uint[maxLength];
            dataLength = 1;
        }
        //***********************************************************************
        // Constructor (Default value provided by long)
        //***********************************************************************
        public BigInteger(long value)
        {
            data = new uint[maxLength];
            long tempVal = value;
            // copy bytes from long to BigInteger without any assumption of
            // the length of the long datatype
            dataLength = 0;
            while (value != 0 && dataLength < maxLength)
            {
                data[dataLength] = (uint)(value & 0xFFFFFFFF);
                value >>= 32;
                dataLength++;
            }
            if (tempVal > 0)         // overflow check for +ve value
            {
                if (value != 0 || (data[maxLength - 1] & 0x80000000) != 0)
                    throw (new ArithmeticException("Positive overflow in constructor."));
            }
            else if (tempVal < 0)    // underflow check for -ve value
            {
                if (value != -1 || (data[dataLength - 1] & 0x80000000) == 0)
                    throw (new ArithmeticException("Negative underflow in constructor."));
            }
            if (dataLength == 0)
                dataLength = 1;
        }
        //***********************************************************************
        // Constructor (Default value provided by ulong)
        //***********************************************************************
        public BigInteger(ulong value)
        {
            data = new uint[maxLength];
            // copy bytes from ulong to BigInteger without any assumption of
            // the length of the ulong datatype
            dataLength = 0;
            while (value != 0 && dataLength < maxLength)
            {
                data[dataLength] = (uint)(value & 0xFFFFFFFF);
                value >>= 32;
                dataLength++;
            }
            if (value != 0 || (data[maxLength - 1] & 0x80000000) != 0)
                throw (new ArithmeticException("Positive overflow in constructor."));
            if (dataLength == 0)
                dataLength = 1;
        }
        //***********************************************************************
        // Constructor (Default value provided by BigInteger)
        //***********************************************************************
        public BigInteger(BigInteger bi)
        {
            data = new uint[maxLength];
            dataLength = bi.dataLength;
            for (int i = 0; i < dataLength; i++)
                data[i] = bi.data[i];
        }
        //***********************************************************************
        // Constructor (Default value provided by a string of digits of the
        //              specified base)
        //
        // Example (base 10)
        // -----------------
        // To initialize "a" with the default value of 1234 in base 10
        //      BigInteger a = new BigInteger("1234", 10)
        //
        // To initialize "a" with the default value of -1234
        //      BigInteger a = new BigInteger("-1234", 10)
        //
        // Example (base 16)
        // -----------------
        // To initialize "a" with the default value of 0x1D4F in base 16
        //      BigInteger a = new BigInteger("1D4F", 16)
        //
        // To initialize "a" with the default value of -0x1D4F
        //      BigInteger a = new BigInteger("-1D4F", 16)
        //
        // Note that string values are specified in the <sign><magnitude>
        // format.
        //
        //***********************************************************************
        public BigInteger(string value, int radix)
        {
            BigInteger multiplier = new BigInteger(1);
            BigInteger result = new BigInteger();
            value = (value.ToUpper()).Trim();
            int limit = 0;
            if (value[0] == '-')
                limit = 1;
            for (int i = value.Length - 1; i >= limit; i--)
            {
                int posVal = (int)value[i];
                if (posVal >= '0' && posVal <= '9')
                    posVal -= '0';
                else if (posVal >= 'A' && posVal <= 'Z')
                    posVal = (posVal - 'A') + 10;
                else
                    posVal = 9999999;       // arbitrary large
                if (posVal >= radix)
                    throw (new ArithmeticException("Invalid string in constructor."));
                else
                {
                    if (value[0] == '-')
                        posVal = -posVal;
                    result = result + (multiplier * posVal);
                    if ((i - 1) >= limit)
                        multiplier = multiplier * radix;
                }
            }
            if (value[0] == '-')     // negative values
            {
                if ((result.data[maxLength - 1] & 0x80000000) == 0)
                    throw (new ArithmeticException("Negative underflow in constructor."));
            }
            else    // positive values
            {
                if ((result.data[maxLength - 1] & 0x80000000) != 0)
                    throw (new ArithmeticException("Positive overflow in constructor."));
            }
            data = new uint[maxLength];
            for (int i = 0; i < result.dataLength; i++)
                data[i] = result.data[i];
            dataLength = result.dataLength;
        }
        //***********************************************************************
        // Constructor (Default value provided by an array of bytes)
        //
        // The lowest index of the input byte array (i.e [0]) should contain the
        // most significant byte of the number, and the highest index should
        // contain the least significant byte.
        //
        // E.g.
        // To initialize "a" with the default value of 0x1D4F in base 16
        //      byte[] temp = { 0x1D, 0x4F };
        //      BigInteger a = new BigInteger(temp)
        //
        // Note that this method of initialization does not allow the
        // sign to be specified.
        //
        //***********************************************************************
        public BigInteger(byte[] inData)
        {
            dataLength = inData.Length >> 2;
            int leftOver = inData.Length & 0x3;
            if (leftOver != 0)         // length not multiples of 4
                dataLength++;
            if (dataLength > maxLength)
                throw (new ArithmeticException("Byte overflow in constructor."));
            data = new uint[maxLength];
            for (int i = inData.Length - 1, j = 0; i >= 3; i -= 4, j++)
            {
                data[j] = (uint)((inData[i - 3] << 24) + (inData[i - 2] << 16) +
                                 (inData[i - 1] << 8) + inData[i]);
            }
            if (leftOver == 1)
                data[dataLength - 1] = (uint)inData[0];
            else if (leftOver == 2)
                data[dataLength - 1] = (uint)((inData[0] << 8) + inData[1]);
            else if (leftOver == 3)
                data[dataLength - 1] = (uint)((inData[0] << 16) + (inData[1] << 8) + inData[2]);
            while (dataLength > 1 && data[dataLength - 1] == 0)
                dataLength--;
            //Console.WriteLine("Len = " + dataLength);
        }
        //***********************************************************************
        // Constructor (Default value provided by an array of bytes of the
        // specified length.)
        //***********************************************************************
        public BigInteger(byte[] inData, int inLen)
        {
            dataLength = inLen >> 2;
            int leftOver = inLen & 0x3;
            if (leftOver != 0)         // length not multiples of 4
                dataLength++;
            if (dataLength > maxLength || inLen > inData.Length)
                throw (new ArithmeticException("Byte overflow in constructor."));
            data = new uint[maxLength];
            for (int i = inLen - 1, j = 0; i >= 3; i -= 4, j++)
            {
                data[j] = (uint)((inData[i - 3] << 24) + (inData[i - 2] << 16) +
                                 (inData[i - 1] << 8) + inData[i]);
            }
            if (leftOver == 1)
                data[dataLength - 1] = (uint)inData[0];
            else if (leftOver == 2)
                data[dataLength - 1] = (uint)((inData[0] << 8) + inData[1]);
            else if (leftOver == 3)
                data[dataLength - 1] = (uint)((inData[0] << 16) + (inData[1] << 8) + inData[2]);
            if (dataLength == 0)
                dataLength = 1;
            while (dataLength > 1 && data[dataLength - 1] == 0)
                dataLength--;
            //Console.WriteLine("Len = " + dataLength);
        }
        //***********************************************************************
        // Constructor (Default value provided by an array of unsigned integers)
        //*********************************************************************
        public BigInteger(uint[] inData)
        {
            dataLength = inData.Length;
            if (dataLength > maxLength)
                throw (new ArithmeticException("Byte overflow in constructor."));
            data = new uint[maxLength];
            for (int i = dataLength - 1, j = 0; i >= 0; i--, j++)
                data[j] = inData[i];
            while (dataLength > 1 && data[dataLength - 1] == 0)
                dataLength--;
            //Console.WriteLine("Len = " + dataLength);
        }
        //***********************************************************************
        // Overloading of the typecast operator.
        // For BigInteger bi = 10;
        //***********************************************************************
        public static implicit operator BigInteger(long value)
        {
            return (new BigInteger(value));
        }
        public static implicit operator BigInteger(ulong value)
        {
            return (new BigInteger(value));
        }
        public static implicit operator BigInteger(int value)
        {
            return (new BigInteger((long)value));
        }
        public static implicit operator BigInteger(uint value)
        {
            return (new BigInteger((ulong)value));
        }
        //***********************************************************************
        // Overloading of addition operator
        //***********************************************************************
        public static BigInteger operator +(BigInteger bi1, BigInteger bi2)
        {
            BigInteger result = new BigInteger();
            result.dataLength = (bi1.dataLength > bi2.dataLength) ? bi1.dataLength : bi2.dataLength;
            long carry = 0;
            for (int i = 0; i < result.dataLength; i++)
            {
                long sum = (long)bi1.data[i] + (long)bi2.data[i] + carry;
                carry = sum >> 32;
                result.data[i] = (uint)(sum & 0xFFFFFFFF);
            }
            if (carry != 0 && result.dataLength < maxLength)
            {
                result.data[result.dataLength] = (uint)(carry);
                result.dataLength++;
            }
            while (result.dataLength > 1 && result.data[result.dataLength - 1] == 0)
                result.dataLength--;
            // overflow check
            int lastPos = maxLength - 1;
            if ((bi1.data[lastPos] & 0x80000000) == (bi2.data[lastPos] & 0x80000000) &&
               (result.data[lastPos] & 0x80000000) != (bi1.data[lastPos] & 0x80000000))
            {
                throw (new ArithmeticException());
            }
            return result;
        }
        //***********************************************************************
        // Overloading of the unary ++ operator
        //***********************************************************************
        public static BigInteger operator ++(BigInteger bi1)
        {
            BigInteger result = new BigInteger(bi1);
            long val, carry = 1;
            int index = 0;
            while (carry != 0 && index < maxLength)
            {
                val = (long)(result.data[index]);
                val++;
                result.data[index] = (uint)(val & 0xFFFFFFFF);
                carry = val >> 32;
                index++;
            }
            if (index > result.dataLength)
                result.dataLength = index;
            else
            {
                while (result.dataLength > 1 && result.data[result.dataLength - 1] == 0)
                    result.dataLength--;
            }
            // overflow check
            int lastPos = maxLength - 1;
            // overflow if initial value was +ve but ++ caused a sign
            // change to negative.
            if ((bi1.data[lastPos] & 0x80000000) == 0 &&
               (result.data[lastPos] & 0x80000000) != (bi1.data[lastPos] & 0x80000000))
            {
                throw (new ArithmeticException("Overflow in ++."));
            }
            return result;
        }
        //***********************************************************************
        // Overloading of subtraction operator
        //***********************************************************************
        public static BigInteger operator -(BigInteger bi1, BigInteger bi2)
        {
            BigInteger result = new BigInteger();
            result.dataLength = (bi1.dataLength > bi2.dataLength) ? bi1.dataLength : bi2.dataLength;
            long carryIn = 0;
            for (int i = 0; i < result.dataLength; i++)
            {
                long diff;
                diff = (long)bi1.data[i] - (long)bi2.data[i] - carryIn;
                result.data[i] = (uint)(diff & 0xFFFFFFFF);
                if (diff < 0)
                    carryIn = 1;
                else
                    carryIn = 0;
            }
            // roll over to negative
            if (carryIn != 0)
            {
                for (int i = result.dataLength; i < maxLength; i++)
                    result.data[i] = 0xFFFFFFFF;
                result.dataLength = maxLength;
            }
            // fixed in v1.03 to give correct datalength for a - (-b)
            while (result.dataLength > 1 && result.data[result.dataLength - 1] == 0)
                result.dataLength--;
            // overflow check
            int lastPos = maxLength - 1;
            if ((bi1.data[lastPos] & 0x80000000) != (bi2.data[lastPos] & 0x80000000) &&
               (result.data[lastPos] & 0x80000000) != (bi1.data[lastPos] & 0x80000000))
            {
                throw (new ArithmeticException());
            }
            return result;
        }
        //***********************************************************************
        // Overloading of the unary -- operator
        //***********************************************************************
        public static BigInteger operator --(BigInteger bi1)
        {
            BigInteger result = new BigInteger(bi1);
            long val;
            bool carryIn = true;
            int index = 0;
            while (carryIn && index < maxLength)
            {
                val = (long)(result.data[index]);
                val--;
                result.data[index] = (uint)(val & 0xFFFFFFFF);
                if (val >= 0)
                    carryIn = false;
                index++;
            }
            if (index > result.dataLength)
                result.dataLength = index;
            while (result.dataLength > 1 && result.data[result.dataLength - 1] == 0)
                result.dataLength--;
            // overflow check
            int lastPos = maxLength - 1;
            // overflow if initial value was -ve but -- caused a sign
            // change to positive.
            if ((bi1.data[lastPos] & 0x80000000) != 0 &&
               (result.data[lastPos] & 0x80000000) != (bi1.data[lastPos] & 0x80000000))
            {
                throw (new ArithmeticException("Underflow in --."));
            }
            return result;
        }
        //***********************************************************************
        // Overloading of multiplication operator
        //***********************************************************************
        public static BigInteger operator *(BigInteger bi1, BigInteger bi2)
        {
            int lastPos = maxLength - 1;
            bool bi1Neg = false, bi2Neg = false;
            // take the absolute value of the inputs
            try
            {
                if ((bi1.data[lastPos] & 0x80000000) != 0)     // bi1 negative
                {
                    bi1Neg = true; bi1 = -bi1;
                }
                if ((bi2.data[lastPos] & 0x80000000) != 0)     // bi2 negative
                {
                    bi2Neg = true; bi2 = -bi2;
                }
            }
            catch (Exception) { }
            BigInteger result = new BigInteger();
            // multiply the absolute values
            try
            {
                for (int i = 0; i < bi1.dataLength; i++)
                {
                    if (bi1.data[i] == 0) continue;
                    ulong mcarry = 0;
                    for (int j = 0, k = i; j < bi2.dataLength; j++, k++)
                    {
                        // k = i + j
                        ulong val = ((ulong)bi1.data[i] * (ulong)bi2.data[j]) +
                                     (ulong)result.data[k] + mcarry;
                        result.data[k] = (uint)(val & 0xFFFFFFFF);
                        mcarry = (val >> 32);
                    }
                    if (mcarry != 0)
                        result.data[i + bi2.dataLength] = (uint)mcarry;
                }
            }
            catch (Exception)
            {
                throw (new ArithmeticException("Multiplication overflow."));
            }
            result.dataLength = bi1.dataLength + bi2.dataLength;
            if (result.dataLength > maxLength)
                result.dataLength = maxLength;
            while (result.dataLength > 1 && result.data[result.dataLength - 1] == 0)
                result.dataLength--;
            // overflow check (result is -ve)
            if ((result.data[lastPos] & 0x80000000) != 0)
            {
                if (bi1Neg != bi2Neg && result.data[lastPos] == 0x80000000)    // different sign
                {
                    // handle the special case where multiplication produces
                    // a max negative number in 2's complement.
                    if (result.dataLength == 1)
                        return result;
                    else
                    {
                        bool isMaxNeg = true;
                        for (int i = 0; i < result.dataLength - 1 && isMaxNeg; i++)
                        {
                            if (result.data[i] != 0)
                                isMaxNeg = false;
                        }
                        if (isMaxNeg)
                            return result;
                    }
                }
                throw (new ArithmeticException("Multiplication overflow."));
            }
            // if input has different signs, then result is -ve
            if (bi1Neg != bi2Neg)
                return -result;
            return result;
        }
        //***********************************************************************
        // Overloading of unary << operators
        //***********************************************************************
        public static BigInteger operator <<(BigInteger bi1, int shiftVal)
        {
            BigInteger result = new BigInteger(bi1);
            result.dataLength = shiftLeft(result.data, shiftVal);
            return result;
        }
        // least significant bits at lower part of buffer
        private static int shiftLeft(uint[] buffer, int shiftVal)
        {
            int shiftAmount = 32;
            int bufLen = buffer.Length;
            while (bufLen > 1 && buffer[bufLen - 1] == 0)
                bufLen--;
            for (int count = shiftVal; count > 0;)
            {
                if (count < shiftAmount)
                    shiftAmount = count;
                //Console.WriteLine("shiftAmount = {0}", shiftAmount);
                ulong carry = 0;
                for (int i = 0; i < bufLen; i++)
                {
                    ulong val = ((ulong)buffer[i]) << shiftAmount;
                    val |= carry;
                    buffer[i] = (uint)(val & 0xFFFFFFFF);
                    carry = val >> 32;
                }
                if (carry != 0)
                {
                    if (bufLen + 1 <= buffer.Length)
                    {
                        buffer[bufLen] = (uint)carry;
                        bufLen++;
                    }
                }
                count -= shiftAmount;
            }
            return bufLen;
        }
        //***********************************************************************
        // Overloading of unary >> operators
        //***********************************************************************
        public static BigInteger operator >>(BigInteger bi1, int shiftVal)
        {
            BigInteger result = new BigInteger(bi1);
            result.dataLength = shiftRight(result.data, shiftVal);
            if ((bi1.data[maxLength - 1] & 0x80000000) != 0) // negative
            {
                for (int i = maxLength - 1; i >= result.dataLength; i--)
                    result.data[i] = 0xFFFFFFFF;
                uint mask = 0x80000000;
                for (int i = 0; i < 32; i++)
                {
                    if ((result.data[result.dataLength - 1] & mask) != 0)
                        break;
                    result.data[result.dataLength - 1] |= mask;
                    mask >>= 1;
                }
                result.dataLength = maxLength;
            }
            return result;
        }
        private static int shiftRight(uint[] buffer, int shiftVal)
        {
            int shiftAmount = 32;
            int invShift = 0;
            int bufLen = buffer.Length;
            while (bufLen > 1 && buffer[bufLen - 1] == 0)
                bufLen--;
            //Console.WriteLine("bufLen = " + bufLen + " buffer.Length = " + buffer.Length);
            for (int count = shiftVal; count > 0;)
            {
                if (count < shiftAmount)
                {
                    shiftAmount = count;
                    invShift = 32 - shiftAmount;
                }
                //Console.WriteLine("shiftAmount = {0}", shiftAmount);
                ulong carry = 0;
                for (int i = bufLen - 1; i >= 0; i--)
                {
                    ulong val = ((ulong)buffer[i]) >> shiftAmount;
                    val |= carry;
                    carry = ((ulong)buffer[i]) << invShift;
                    buffer[i] = (uint)(val);
                }
                count -= shiftAmount;
            }
            while (bufLen > 1 && buffer[bufLen - 1] == 0)
                bufLen--;
            return bufLen;
        }
        //***********************************************************************
        // Overloading of the NOT operator (1's complement)
        //***********************************************************************
        public static BigInteger operator ~(BigInteger bi1)
        {
            BigInteger result = new BigInteger(bi1);
            for (int i = 0; i < maxLength; i++)
                result.data[i] = (uint)(~(bi1.data[i]));
            result.dataLength = maxLength;
            while (result.dataLength > 1 && result.data[result.dataLength - 1] == 0)
                result.dataLength--;
            return result;
        }
        //***********************************************************************
        // Overloading of the NEGATE operator (2's complement)
        //***********************************************************************
        public static BigInteger operator -(BigInteger bi1)
        {
            // handle neg of zero separately since it'll cause an overflow
            // if we proceed.
            if (bi1.dataLength == 1 && bi1.data[0] == 0)
                return (new BigInteger());
            BigInteger result = new BigInteger(bi1);
            // 1's complement
            for (int i = 0; i < maxLength; i++)
                result.data[i] = (uint)(~(bi1.data[i]));
            // add one to result of 1's complement
            long val, carry = 1;
            int index = 0;
            while (carry != 0 && index < maxLength)
            {
                val = (long)(result.data[index]);
                val++;
                result.data[index] = (uint)(val & 0xFFFFFFFF);
                carry = val >> 32;
                index++;
            }
            if ((bi1.data[maxLength - 1] & 0x80000000) == (result.data[maxLength - 1] & 0x80000000))
                throw (new ArithmeticException("Overflow in negation.\n"));
            result.dataLength = maxLength;
            while (result.dataLength > 1 && result.data[result.dataLength - 1] == 0)
                result.dataLength--;
            return result;
        }
        //***********************************************************************
        // Overloading of equality operator
        //***********************************************************************
        public static bool operator ==(BigInteger bi1, BigInteger bi2)
        {
            return bi1.Equals(bi2);
        }
        public static bool operator !=(BigInteger bi1, BigInteger bi2)
        {
            return !(bi1.Equals(bi2));
        }
        public override bool Equals(object o)
        {
            BigInteger bi = (BigInteger)o;
            if (this.dataLength != bi.dataLength)
                return false;
            for (int i = 0; i < this.dataLength; i++)
            {
                if (this.data[i] != bi.data[i])
                    return false;
            }
            return true;
        }
        public override int GetHashCode()
        {
            return this.ToString().GetHashCode();
        }
        //***********************************************************************
        // Overloading of inequality operator
        //***********************************************************************
        public static bool operator >(BigInteger bi1, BigInteger bi2)
        {
            int pos = maxLength - 1;
            // bi1 is negative, bi2 is positive
            if ((bi1.data[pos] & 0x80000000) != 0 && (bi2.data[pos] & 0x80000000) == 0)
                return false;
            // bi1 is positive, bi2 is negative
            else if ((bi1.data[pos] & 0x80000000) == 0 && (bi2.data[pos] & 0x80000000) != 0)
                return true;
            // same sign
            int len = (bi1.dataLength > bi2.dataLength) ? bi1.dataLength : bi2.dataLength;
            for (pos = len - 1; pos >= 0 && bi1.data[pos] == bi2.data[pos]; pos--) ;
            if (pos >= 0)
            {
                if (bi1.data[pos] > bi2.data[pos])
                    return true;
                return false;
            }
            return false;
        }
        public static bool operator <(BigInteger bi1, BigInteger bi2)
        {
            int pos = maxLength - 1;
            // bi1 is negative, bi2 is positive
            if ((bi1.data[pos] & 0x80000000) != 0 && (bi2.data[pos] & 0x80000000) == 0)
                return true;
            // bi1 is positive, bi2 is negative
            else if ((bi1.data[pos] & 0x80000000) == 0 && (bi2.data[pos] & 0x80000000) != 0)
                return false;
            // same sign
            int len = (bi1.dataLength > bi2.dataLength) ? bi1.dataLength : bi2.dataLength;
            for (pos = len - 1; pos >= 0 && bi1.data[pos] == bi2.data[pos]; pos--) ;
            if (pos >= 0)
            {
                if (bi1.data[pos] < bi2.data[pos])
                    return true;
                return false;
            }
            return false;
        }
        public static bool operator >=(BigInteger bi1, BigInteger bi2)
        {
            return (bi1 == bi2 || bi1 > bi2);
        }
        public static bool operator <=(BigInteger bi1, BigInteger bi2)
        {
            return (bi1 == bi2 || bi1 < bi2);
        }
        //***********************************************************************
        // Private function that supports the division of two numbers with
        // a divisor that has more than 1 digit.
        //
        // Algorithm taken from [1]
        //***********************************************************************
        private static void multiByteDivide(BigInteger bi1, BigInteger bi2,
                                            BigInteger outQuotient, BigInteger outRemainder)
        {
            uint[] result = new uint[maxLength];
            int remainderLen = bi1.dataLength + 1;
            uint[] remainder = new uint[remainderLen];
            uint mask = 0x80000000;
            uint val = bi2.data[bi2.dataLength - 1];
            int shift = 0, resultPos = 0;
            while (mask != 0 && (val & mask) == 0)
            {
                shift++; mask >>= 1;
            }
            //Console.WriteLine("shift = {0}", shift);
            //Console.WriteLine("Before bi1 Len = {0}, bi2 Len = {1}", bi1.dataLength, bi2.dataLength);
            for (int i = 0; i < bi1.dataLength; i++)
                remainder[i] = bi1.data[i];
            shiftLeft(remainder, shift);
            bi2 = bi2 << shift;
            /*
            Console.WriteLine("bi1 Len = {0}, bi2 Len = {1}", bi1.dataLength, bi2.dataLength);
            Console.WriteLine("dividend = " + bi1 + "\ndivisor = " + bi2);
            for(int q = remainderLen - 1; q >= 0; q--)
                    Console.Write("{0:x2}", remainder[q]);
            Console.WriteLine();
            */
            int j = remainderLen - bi2.dataLength;
            int pos = remainderLen - 1;
            ulong firstDivisorByte = bi2.data[bi2.dataLength - 1];
            ulong secondDivisorByte = bi2.data[bi2.dataLength - 2];
            int divisorLen = bi2.dataLength + 1;
            uint[] dividendPart = new uint[divisorLen];
            while (j > 0)
            {
                ulong dividend = ((ulong)remainder[pos] << 32) + (ulong)remainder[pos - 1];
                //Console.WriteLine("dividend = {0}", dividend);
                ulong q_hat = dividend / firstDivisorByte;
                ulong r_hat = dividend % firstDivisorByte;
                //Console.WriteLine("q_hat = {0:X}, r_hat = {1:X}", q_hat, r_hat);
                bool done = false;
                while (!done)
                {
                    done = true;
                    if (q_hat == 0x100000000 ||
                       (q_hat * secondDivisorByte) > ((r_hat << 32) + remainder[pos - 2]))
                    {
                        q_hat--;
                        r_hat += firstDivisorByte;
                        if (r_hat < 0x100000000)
                            done = false;
                    }
                }
                for (int h = 0; h < divisorLen; h++)
                    dividendPart[h] = remainder[pos - h];
                BigInteger kk = new BigInteger(dividendPart);
                BigInteger ss = bi2 * (long)q_hat;
                //Console.WriteLine("ss before = " + ss);
                while (ss > kk)
                {
                    q_hat--;
                    ss -= bi2;
                    //Console.WriteLine(ss);
                }
                BigInteger yy = kk - ss;
                //Console.WriteLine("ss = " + ss);
                //Console.WriteLine("kk = " + kk);
                //Console.WriteLine("yy = " + yy);
                for (int h = 0; h < divisorLen; h++)
                    remainder[pos - h] = yy.data[bi2.dataLength - h];
                /*
                Console.WriteLine("dividend = ");
                for(int q = remainderLen - 1; q >= 0; q--)
                        Console.Write("{0:x2}", remainder[q]);
                Console.WriteLine("\n************ q_hat = {0:X}\n", q_hat);
                */
                result[resultPos++] = (uint)q_hat;
                pos--;
                j--;
            }
            outQuotient.dataLength = resultPos;
            int y = 0;
            for (int x = outQuotient.dataLength - 1; x >= 0; x--, y++)
                outQuotient.data[y] = result[x];
            for (; y < maxLength; y++)
                outQuotient.data[y] = 0;
            while (outQuotient.dataLength > 1 && outQuotient.data[outQuotient.dataLength - 1] == 0)
                outQuotient.dataLength--;
            if (outQuotient.dataLength == 0)
                outQuotient.dataLength = 1;
            outRemainder.dataLength = shiftRight(remainder, shift);
            for (y = 0; y < outRemainder.dataLength; y++)
                outRemainder.data[y] = remainder[y];
            for (; y < maxLength; y++)
                outRemainder.data[y] = 0;
        }
        //***********************************************************************
        // Private function that supports the division of two numbers with
        // a divisor that has only 1 digit.
        //***********************************************************************
        private static void singleByteDivide(BigInteger bi1, BigInteger bi2,
                                             BigInteger outQuotient, BigInteger outRemainder)
        {
            uint[] result = new uint[maxLength];
            int resultPos = 0;
            // copy dividend to reminder
            for (int i = 0; i < maxLength; i++)
                outRemainder.data[i] = bi1.data[i];
            outRemainder.dataLength = bi1.dataLength;
            while (outRemainder.dataLength > 1 && outRemainder.data[outRemainder.dataLength - 1] == 0)
                outRemainder.dataLength--;
            ulong divisor = (ulong)bi2.data[0];
            int pos = outRemainder.dataLength - 1;
            ulong dividend = (ulong)outRemainder.data[pos];
            //Console.WriteLine("divisor = " + divisor + " dividend = " + dividend);
            //Console.WriteLine("divisor = " + bi2 + "\ndividend = " + bi1);
            if (dividend >= divisor)
            {
                ulong quotient = dividend / divisor;
                result[resultPos++] = (uint)quotient;
                outRemainder.data[pos] = (uint)(dividend % divisor);
            }
            pos--;
            while (pos >= 0)
            {
                //Console.WriteLine(pos);
                dividend = ((ulong)outRemainder.data[pos + 1] << 32) + (ulong)outRemainder.data[pos];
                ulong quotient = dividend / divisor;
                result[resultPos++] = (uint)quotient;
                outRemainder.data[pos + 1] = 0;
                outRemainder.data[pos--] = (uint)(dividend % divisor);
                //Console.WriteLine(">>>> " + bi1);
            }
            outQuotient.dataLength = resultPos;
            int j = 0;
            for (int i = outQuotient.dataLength - 1; i >= 0; i--, j++)
                outQuotient.data[j] = result[i];
            for (; j < maxLength; j++)
                outQuotient.data[j] = 0;
            while (outQuotient.dataLength > 1 && outQuotient.data[outQuotient.dataLength - 1] == 0)
                outQuotient.dataLength--;
            if (outQuotient.dataLength == 0)
                outQuotient.dataLength = 1;
            while (outRemainder.dataLength > 1 && outRemainder.data[outRemainder.dataLength - 1] == 0)
                outRemainder.dataLength--;
        }
        //***********************************************************************
        // Overloading of division operator
        //***********************************************************************
        public static BigInteger operator /(BigInteger bi1, BigInteger bi2)
        {
            BigInteger quotient = new BigInteger();
            BigInteger remainder = new BigInteger();
            int lastPos = maxLength - 1;
            bool divisorNeg = false, dividendNeg = false;
            if ((bi1.data[lastPos] & 0x80000000) != 0)     // bi1 negative
            {
                bi1 = -bi1;
                dividendNeg = true;
            }
            if ((bi2.data[lastPos] & 0x80000000) != 0)     // bi2 negative
            {
                bi2 = -bi2;
                divisorNeg = true;
            }
            if (bi1 < bi2)
            {
                return quotient;
            }
            else
            {
                if (bi2.dataLength == 1)
                    singleByteDivide(bi1, bi2, quotient, remainder);
                else
                    multiByteDivide(bi1, bi2, quotient, remainder);
                if (dividendNeg != divisorNeg)
                    return -quotient;
                return quotient;
            }
        }
        //***********************************************************************
        // Overloading of modulus operator
        //***********************************************************************
        public static BigInteger operator %(BigInteger bi1, BigInteger bi2)
        {
            BigInteger quotient = new BigInteger();
            BigInteger remainder = new BigInteger(bi1);
            int lastPos = maxLength - 1;
            bool dividendNeg = false;
            if ((bi1.data[lastPos] & 0x80000000) != 0)     // bi1 negative
            {
                bi1 = -bi1;
                dividendNeg = true;
            }
            if ((bi2.data[lastPos] & 0x80000000) != 0)     // bi2 negative
                bi2 = -bi2;
            if (bi1 < bi2)
            {
                return remainder;
            }
            else
            {
                if (bi2.dataLength == 1)
                    singleByteDivide(bi1, bi2, quotient, remainder);
                else
                    multiByteDivide(bi1, bi2, quotient, remainder);
                if (dividendNeg)
                    return -remainder;
                return remainder;
            }
        }
        //***********************************************************************
        // Overloading of bitwise AND operator
        //***********************************************************************
        public static BigInteger operator &(BigInteger bi1, BigInteger bi2)
        {
            BigInteger result = new BigInteger();
            int len = (bi1.dataLength > bi2.dataLength) ? bi1.dataLength : bi2.dataLength;
            for (int i = 0; i < len; i++)
            {
                uint sum = (uint)(bi1.data[i] & bi2.data[i]);
                result.data[i] = sum;
            }
            result.dataLength = maxLength;
            while (result.dataLength > 1 && result.data[result.dataLength - 1] == 0)
                result.dataLength--;
            return result;
        }
        //***********************************************************************
        // Overloading of bitwise OR operator
        //***********************************************************************
        public static BigInteger operator |(BigInteger bi1, BigInteger bi2)
        {
            BigInteger result = new BigInteger();
            int len = (bi1.dataLength > bi2.dataLength) ? bi1.dataLength : bi2.dataLength;
            for (int i = 0; i < len; i++)
            {
                uint sum = (uint)(bi1.data[i] | bi2.data[i]);
                result.data[i] = sum;
            }
            result.dataLength = maxLength;
            while (result.dataLength > 1 && result.data[result.dataLength - 1] == 0)
                result.dataLength--;
            return result;
        }
        //***********************************************************************
        // Overloading of bitwise XOR operator
        //***********************************************************************
        public static BigInteger operator ^(BigInteger bi1, BigInteger bi2)
        {
            BigInteger result = new BigInteger();
            int len = (bi1.dataLength > bi2.dataLength) ? bi1.dataLength : bi2.dataLength;
            for (int i = 0; i < len; i++)
            {
                uint sum = (uint)(bi1.data[i] ^ bi2.data[i]);
                result.data[i] = sum;
            }
            result.dataLength = maxLength;
            while (result.dataLength > 1 && result.data[result.dataLength - 1] == 0)
                result.dataLength--;
            return result;
        }
        //***********************************************************************
        // Returns max(this, bi)
        //***********************************************************************
        public BigInteger max(BigInteger bi)
        {
            if (this > bi)
                return (new BigInteger(this));
            else
                return (new BigInteger(bi));
        }
        //***********************************************************************
        // Returns min(this, bi)
        //***********************************************************************
        public BigInteger min(BigInteger bi)
        {
            if (this < bi)
                return (new BigInteger(this));
            else
                return (new BigInteger(bi));
        }
        //***********************************************************************
        // Returns the absolute value
        //***********************************************************************
        public BigInteger abs()
        {
            if ((this.data[maxLength - 1] & 0x80000000) != 0)
                return (-this);
            else
                return (new BigInteger(this));
        }
        //***********************************************************************
        // Returns a string representing the BigInteger in base 10.
        //***********************************************************************
        public override string ToString()
        {
            return ToString(10);
        }
        //***********************************************************************
        // Returns a string representing the BigInteger in sign-and-magnitude
        // format in the specified radix.
        //
        // Example
        // -------
        // If the value of BigInteger is -255 in base 10, then
        // ToString(16) returns "-FF"
        //
        //***********************************************************************
        public string ToString(int radix)
        {
            if (radix < 2 || radix > 36)
                throw (new ArgumentException("Radix must be >= 2 and <= 36"));
            string charSet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
            string result = "";
            BigInteger a = this;
            bool negative = false;
            if ((a.data[maxLength - 1] & 0x80000000) != 0)
            {
                negative = true;
                try
                {
                    a = -a;
                }
                catch (Exception) { }
            }
            BigInteger quotient = new BigInteger();
            BigInteger remainder = new BigInteger();
            BigInteger biRadix = new BigInteger(radix);
            if (a.dataLength == 1 && a.data[0] == 0)
                result = "0";
            else
            {
                while (a.dataLength > 1 || (a.dataLength == 1 && a.data[0] != 0))
                {
                    singleByteDivide(a, biRadix, quotient, remainder);
                    if (remainder.data[0] < 10)
                        result = remainder.data[0] + result;
                    else
                        result = charSet[(int)remainder.data[0] - 10] + result;
                    a = quotient;
                }
                if (negative)
                    result = "-" + result;
            }
            return result;
        }
        //***********************************************************************
        // Returns a hex string showing the contains of the BigInteger
        //
        // Examples
        // -------
        // 1) If the value of BigInteger is 255 in base 10, then
        //    ToHexString() returns "FF"
        //
        // 2) If the value of BigInteger is -255 in base 10, then
        //    ToHexString() returns ".....FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF01",
        //    which is the 2's complement representation of -255.
        //
        //***********************************************************************
        public string ToHexString()
        {
            string result = data[dataLength - 1].ToString("X");
            for (int i = dataLength - 2; i >= 0; i--)
            {
                result += data[i].ToString("X8");
            }
            return result;
        }
        //***********************************************************************
        // Modulo Exponentiation
        //***********************************************************************
        public BigInteger modPow(BigInteger exp, BigInteger n)
        {
            if ((exp.data[maxLength - 1] & 0x80000000) != 0)
                throw (new ArithmeticException("Positive exponents only."));
            BigInteger resultNum = 1;
            BigInteger tempNum;
            bool thisNegative = false;
            if ((this.data[maxLength - 1] & 0x80000000) != 0)   // negative this
            {
                tempNum = -this % n;
                thisNegative = true;
            }
            else
                tempNum = this % n;  // ensures (tempNum * tempNum) < b^(2k)
            if ((n.data[maxLength - 1] & 0x80000000) != 0)   // negative n
                n = -n;
            // calculate constant = b^(2k) / m
            BigInteger constant = new BigInteger();
            int i = n.dataLength << 1;
            constant.data[i] = 0x00000001;
            constant.dataLength = i + 1;
            constant = constant / n;
            int totalBits = exp.bitCount();
            int count = 0;
            // perform squaring and multiply exponentiation
            for (int pos = 0; pos < exp.dataLength; pos++)
            {
                uint mask = 0x01;
                //Console.WriteLine("pos = " + pos);
                for (int index = 0; index < 32; index++)
                {
                    if ((exp.data[pos] & mask) != 0)
                        resultNum = BarrettReduction(resultNum * tempNum, n, constant);
                    mask <<= 1;
                    tempNum = BarrettReduction(tempNum * tempNum, n, constant);
                    if (tempNum.dataLength == 1 && tempNum.data[0] == 1)
                    {
                        if (thisNegative && (exp.data[0] & 0x1) != 0)    //odd exp
                            return -resultNum;
                        return resultNum;
                    }
                    count++;
                    if (count == totalBits)
                        break;
                }
            }
            if (thisNegative && (exp.data[0] & 0x1) != 0)    //odd exp
                return -resultNum;
            return resultNum;
        }
        //***********************************************************************
        // Fast calculation of modular reduction using Barrett's reduction.
        // Requires x < b^(2k), where b is the base.  In this case, base is
        // 2^32 (uint).
        //
        // Reference [4]
        //***********************************************************************
        private BigInteger BarrettReduction(BigInteger x, BigInteger n, BigInteger constant)
        {
            int k = n.dataLength,
                kPlusOne = k + 1,
                kMinusOne = k - 1;
            BigInteger q1 = new BigInteger();
            // q1 = x / b^(k-1)
            for (int i = kMinusOne, j = 0; i < x.dataLength; i++, j++)
                q1.data[j] = x.data[i];
            q1.dataLength = x.dataLength - kMinusOne;
            if (q1.dataLength <= 0)
                q1.dataLength = 1;
            BigInteger q2 = q1 * constant;
            BigInteger q3 = new BigInteger();
            // q3 = q2 / b^(k+1)
            for (int i = kPlusOne, j = 0; i < q2.dataLength; i++, j++)
                q3.data[j] = q2.data[i];
            q3.dataLength = q2.dataLength - kPlusOne;
            if (q3.dataLength <= 0)
                q3.dataLength = 1;
            // r1 = x mod b^(k+1)
            // i.e. keep the lowest (k+1) words
            BigInteger r1 = new BigInteger();
            int lengthToCopy = (x.dataLength > kPlusOne) ? kPlusOne : x.dataLength;
            for (int i = 0; i < lengthToCopy; i++)
                r1.data[i] = x.data[i];
            r1.dataLength = lengthToCopy;
            // r2 = (q3 * n) mod b^(k+1)
            // partial multiplication of q3 and n
            BigInteger r2 = new BigInteger();
            for (int i = 0; i < q3.dataLength; i++)
            {
                if (q3.data[i] == 0) continue;
                ulong mcarry = 0;
                int t = i;
                for (int j = 0; j < n.dataLength && t < kPlusOne; j++, t++)
                {
                    // t = i + j
                    ulong val = ((ulong)q3.data[i] * (ulong)n.data[j]) +
                                 (ulong)r2.data[t] + mcarry;
                    r2.data[t] = (uint)(val & 0xFFFFFFFF);
                    mcarry = (val >> 32);
                }
                if (t < kPlusOne)
                    r2.data[t] = (uint)mcarry;
            }
            r2.dataLength = kPlusOne;
            while (r2.dataLength > 1 && r2.data[r2.dataLength - 1] == 0)
                r2.dataLength--;
            r1 -= r2;
            if ((r1.data[maxLength - 1] & 0x80000000) != 0)        // negative
            {
                BigInteger val = new BigInteger();
                val.data[kPlusOne] = 0x00000001;
                val.dataLength = kPlusOne + 1;
                r1 += val;
            }
            while (r1 >= n)
                r1 -= n;
            return r1;
        }
        //***********************************************************************
        // Returns gcd(this, bi)
        //***********************************************************************
        public BigInteger gcd(BigInteger bi)
        {
            BigInteger x;
            BigInteger y;
            if ((data[maxLength - 1] & 0x80000000) != 0)     // negative
                x = -this;
            else
                x = this;
            if ((bi.data[maxLength - 1] & 0x80000000) != 0)     // negative
                y = -bi;
            else
                y = bi;
            BigInteger g = y;
            while (x.dataLength > 1 || (x.dataLength == 1 && x.data[0] != 0))
            {
                g = x;
                x = y % x;
                y = g;
            }
            return g;
        }
        //***********************************************************************
        // Populates "this" with the specified amount of random bits
        //***********************************************************************
        public void genRandomBits(int bits, Random rand)
        {
            int dwords = bits >> 5;
            int remBits = bits & 0x1F;
            if (remBits != 0)
                dwords++;
            if (dwords > maxLength)
                throw (new ArithmeticException("Number of required bits > maxLength."));
            for (int i = 0; i < dwords; i++)
                data[i] = (uint)(rand.NextDouble() * 0x100000000);
            for (int i = dwords; i < maxLength; i++)
                data[i] = 0;
            if (remBits != 0)
            {
                uint mask = (uint)(0x01 << (remBits - 1));
                data[dwords - 1] |= mask;
                mask = (uint)(0xFFFFFFFF >> (32 - remBits));
                data[dwords - 1] &= mask;
            }
            else
                data[dwords - 1] |= 0x80000000;
            dataLength = dwords;
            if (dataLength == 0)
                dataLength = 1;
        }
        //***********************************************************************
        // Returns the position of the most significant bit in the BigInteger.
        //
        // Eg.  The result is 0, if the value of BigInteger is 0...0000 0000
        //      The result is 1, if the value of BigInteger is 0...0000 0001
        //      The result is 2, if the value of BigInteger is 0...0000 0010
        //      The result is 2, if the value of BigInteger is 0...0000 0011
        //
        //***********************************************************************
        public int bitCount()
        {
            while (dataLength > 1 && data[dataLength - 1] == 0)
                dataLength--;
            uint value = data[dataLength - 1];
            uint mask = 0x80000000;
            int bits = 32;
            while (bits > 0 && (value & mask) == 0)
            {
                bits--;
                mask >>= 1;
            }
            bits += ((dataLength - 1) << 5);
            return bits;
        }
        //***********************************************************************
        // Probabilistic prime test based on Fermat's little theorem
        //
        // for any a < p (p does not divide a) if
        //      a^(p-1) mod p != 1 then p is not prime.
        //
        // Otherwise, p is probably prime (pseudoprime to the chosen base).
        //
        // Returns
        // -------
        // True if "this" is a pseudoprime to randomly chosen
        // bases.  The number of chosen bases is given by the "confidence"
        // parameter.
        //
        // False if "this" is definitely NOT prime.
        //
        // Note - this method is fast but fails for Carmichael numbers except
        // when the randomly chosen base is a factor of the number.
        //
        //***********************************************************************
        public bool FermatLittleTest(int confidence)
        {
            BigInteger thisVal;
            if ((this.data[maxLength - 1] & 0x80000000) != 0)        // negative
                thisVal = -this;
            else
                thisVal = this;
            if (thisVal.dataLength == 1)
            {
                // test small numbers
                if (thisVal.data[0] == 0 || thisVal.data[0] == 1)
                    return false;
                else if (thisVal.data[0] == 2 || thisVal.data[0] == 3)
                    return true;
            }
            if ((thisVal.data[0] & 0x1) == 0)     // even numbers
                return false;
            int bits = thisVal.bitCount();
            BigInteger a = new BigInteger();
            BigInteger p_sub1 = thisVal - (new BigInteger(1));
            Random rand = new Random();
            for (int round = 0; round < confidence; round++)
            {
                bool done = false;
                while (!done)       // generate a < n
                {
                    int testBits = 0;
                    // make sure "a" has at least 2 bits
                    while (testBits < 2)
                        testBits = (int)(rand.NextDouble() * bits);
                    a.genRandomBits(testBits, rand);
                    int byteLen = a.dataLength;
                    // make sure "a" is not 0
                    if (byteLen > 1 || (byteLen == 1 && a.data[0] != 1))
                        done = true;
                }
                // check whether a factor exists (fix for version 1.03)
                BigInteger gcdTest = a.gcd(thisVal);
                if (gcdTest.dataLength == 1 && gcdTest.data[0] != 1)
                    return false;
                // calculate a^(p-1) mod p
                BigInteger expResult = a.modPow(p_sub1, thisVal);
                int resultLen = expResult.dataLength;
                // is NOT prime is a^(p-1) mod p != 1
                if (resultLen > 1 || (resultLen == 1 && expResult.data[0] != 1))
                {
                    //Console.WriteLine("a = " + a.ToString());
                    return false;
                }
            }
            return true;
        }
        //***********************************************************************
        // Probabilistic prime test based on Rabin-Miller's
        //
        // for any p > 0 with p - 1 = 2^s * t
        //
        // p is probably prime (strong pseudoprime) if for any a < p,
        // 1) a^t mod p = 1 or
        // 2) a^((2^j)*t) mod p = p-1 for some 0 <= j <= s-1
        //
        // Otherwise, p is composite.
        //
        // Returns
        // -------
        // True if "this" is a strong pseudoprime to randomly chosen
        // bases.  The number of chosen bases is given by the "confidence"
        // parameter.
        //
        // False if "this" is definitely NOT prime.
        //
        //***********************************************************************
        public bool RabinMillerTest(int confidence)
        {
            BigInteger thisVal;
            if ((this.data[maxLength - 1] & 0x80000000) != 0)        // negative
                thisVal = -this;
            else
                thisVal = this;
            if (thisVal.dataLength == 1)
            {
                // test small numbers
                if (thisVal.data[0] == 0 || thisVal.data[0] == 1)
                    return false;
                else if (thisVal.data[0] == 2 || thisVal.data[0] == 3)
                    return true;
            }
            if ((thisVal.data[0] & 0x1) == 0)     // even numbers
                return false;
            // calculate values of s and t
            BigInteger p_sub1 = thisVal - (new BigInteger(1));
            int s = 0;
            for (int index = 0; index < p_sub1.dataLength; index++)
            {
                uint mask = 0x01;
                for (int i = 0; i < 32; i++)
                {
                    if ((p_sub1.data[index] & mask) != 0)
                    {
                        index = p_sub1.dataLength;      // to break the outer loop
                        break;
                    }
                    mask <<= 1;
                    s++;
                }
            }
            BigInteger t = p_sub1 >> s;
            int bits = thisVal.bitCount();
            BigInteger a = new BigInteger();
            Random rand = new Random();
            for (int round = 0; round < confidence; round++)
            {
                bool done = false;
                while (!done)       // generate a < n
                {
                    int testBits = 0;
                    // make sure "a" has at least 2 bits
                    while (testBits < 2)
                        testBits = (int)(rand.NextDouble() * bits);
                    a.genRandomBits(testBits, rand);
                    int byteLen = a.dataLength;
                    // make sure "a" is not 0
                    if (byteLen > 1 || (byteLen == 1 && a.data[0] != 1))
                        done = true;
                }
                // check whether a factor exists (fix for version 1.03)
                BigInteger gcdTest = a.gcd(thisVal);
                if (gcdTest.dataLength == 1 && gcdTest.data[0] != 1)
                    return false;
                BigInteger b = a.modPow(t, thisVal);
                /*
                Console.WriteLine("a = " + a.ToString(10));
                Console.WriteLine("b = " + b.ToString(10));
                Console.WriteLine("t = " + t.ToString(10));
                Console.WriteLine("s = " + s);
                */
                bool result = false;
                if (b.dataLength == 1 && b.data[0] == 1)         // a^t mod p = 1
                    result = true;
                for (int j = 0; result == false && j < s; j++)
                {
                    if (b == p_sub1)         // a^((2^j)*t) mod p = p-1 for some 0 <= j <= s-1
                    {
                        result = true;
                        break;
                    }
                    b = (b * b) % thisVal;
                }
                if (result == false)
                    return false;
            }
            return true;
        }
        //***********************************************************************
        // Probabilistic prime test based on Solovay-Strassen (Euler Criterion)
        //
        // p is probably prime if for any a < p (a is not multiple of p),
        // a^((p-1)/2) mod p = J(a, p)
        //
        // where J is the Jacobi symbol.
        //
        // Otherwise, p is composite.
        //
        // Returns
        // -------
        // True if "this" is a Euler pseudoprime to randomly chosen
        // bases.  The number of chosen bases is given by the "confidence"
        // parameter.
        //
        // False if "this" is definitely NOT prime.
        //
        //***********************************************************************
        public bool SolovayStrassenTest(int confidence)
        {
            BigInteger thisVal;
            if ((this.data[maxLength - 1] & 0x80000000) != 0)        // negative
                thisVal = -this;
            else
                thisVal = this;
            if (thisVal.dataLength == 1)
            {
                // test small numbers
                if (thisVal.data[0] == 0 || thisVal.data[0] == 1)
                    return false;
                else if (thisVal.data[0] == 2 || thisVal.data[0] == 3)
                    return true;
            }
            if ((thisVal.data[0] & 0x1) == 0)     // even numbers
                return false;
            int bits = thisVal.bitCount();
            BigInteger a = new BigInteger();
            BigInteger p_sub1 = thisVal - 1;
            BigInteger p_sub1_shift = p_sub1 >> 1;
            Random rand = new Random();
            for (int round = 0; round < confidence; round++)
            {
                bool done = false;
                while (!done)       // generate a < n
                {
                    int testBits = 0;
                    // make sure "a" has at least 2 bits
                    while (testBits < 2)
                        testBits = (int)(rand.NextDouble() * bits);
                    a.genRandomBits(testBits, rand);
                    int byteLen = a.dataLength;
                    // make sure "a" is not 0
                    if (byteLen > 1 || (byteLen == 1 && a.data[0] != 1))
                        done = true;
                }
                // check whether a factor exists (fix for version 1.03)
                BigInteger gcdTest = a.gcd(thisVal);
                if (gcdTest.dataLength == 1 && gcdTest.data[0] != 1)
                    return false;
                // calculate a^((p-1)/2) mod p
                BigInteger expResult = a.modPow(p_sub1_shift, thisVal);
                if (expResult == p_sub1)
                    expResult = -1;
                // calculate Jacobi symbol
                BigInteger jacob = Jacobi(a, thisVal);
                //Console.WriteLine("a = " + a.ToString(10) + " b = " + thisVal.ToString(10));
                //Console.WriteLine("expResult = " + expResult.ToString(10) + " Jacob = " + jacob.ToString(10));
                // if they are different then it is not prime
                if (expResult != jacob)
                    return false;
            }
            return true;
        }
        //***********************************************************************
        // Implementation of the Lucas Strong Pseudo Prime test.
        //
        // Let n be an odd number with gcd(n,D) = 1, and n - J(D, n) = 2^s * d
        // with d odd and s >= 0.
        //
        // If Ud mod n = 0 or V2^r*d mod n = 0 for some 0 <= r < s, then n
        // is a strong Lucas pseudoprime with parameters (P, Q).  We select
        // P and Q based on Selfridge.
        //
        // Returns True if number is a strong Lucus pseudo prime.
        // Otherwise, returns False indicating that number is composite.
        //***********************************************************************
        public bool LucasStrongTest()
        {
            BigInteger thisVal;
            if ((this.data[maxLength - 1] & 0x80000000) != 0)        // negative
                thisVal = -this;
            else
                thisVal = this;
            if (thisVal.dataLength == 1)
            {
                // test small numbers
                if (thisVal.data[0] == 0 || thisVal.data[0] == 1)
                    return false;
                else if (thisVal.data[0] == 2 || thisVal.data[0] == 3)
                    return true;
            }
            if ((thisVal.data[0] & 0x1) == 0)     // even numbers
                return false;
            return LucasStrongTestHelper(thisVal);
        }
        private bool LucasStrongTestHelper(BigInteger thisVal)
        {
            // Do the test (selects D based on Selfridge)
            // Let D be the first element of the sequence
            // 5, -7, 9, -11, 13, ... for which J(D,n) = -1
            // Let P = 1, Q = (1-D) / 4
            long D = 5, sign = -1, dCount = 0;
            bool done = false;
            while (!done)
            {
                int Jresult = BigInteger.Jacobi(D, thisVal);
                if (Jresult == -1)
                    done = true;    // J(D, this) = 1
                else
                {
                    if (Jresult == 0 && Math.Abs(D) < thisVal)       // divisor found
                        return false;
                    if (dCount == 20)
                    {
                        // check for square
                        BigInteger root = thisVal.sqrt();
                        if (root * root == thisVal)
                            return false;
                    }
                    //Console.WriteLine(D);
                    D = (Math.Abs(D) + 2) * sign;
                    sign = -sign;
                }
                dCount++;
            }
            long Q = (1 - D) >> 2;
            /*
            Console.WriteLine("D = " + D);
            Console.WriteLine("Q = " + Q);
            Console.WriteLine("(n,D) = " + thisVal.gcd(D));
            Console.WriteLine("(n,Q) = " + thisVal.gcd(Q));
            Console.WriteLine("J(D|n) = " + BigInteger.Jacobi(D, thisVal));
            */
            BigInteger p_add1 = thisVal + 1;
            int s = 0;
            for (int index = 0; index < p_add1.dataLength; index++)
            {
                uint mask = 0x01;
                for (int i = 0; i < 32; i++)
                {
                    if ((p_add1.data[index] & mask) != 0)
                    {
                        index = p_add1.dataLength;      // to break the outer loop
                        break;
                    }
                    mask <<= 1;
                    s++;
                }
            }
            BigInteger t = p_add1 >> s;
            // calculate constant = b^(2k) / m
            // for Barrett Reduction
            BigInteger constant = new BigInteger();
            int nLen = thisVal.dataLength << 1;
            constant.data[nLen] = 0x00000001;
            constant.dataLength = nLen + 1;
            constant = constant / thisVal;
            BigInteger[] lucas = LucasSequenceHelper(1, Q, t, thisVal, constant, 0);
            bool isPrime = false;
            if ((lucas[0].dataLength == 1 && lucas[0].data[0] == 0) ||
               (lucas[1].dataLength == 1 && lucas[1].data[0] == 0))
            {
                // u(t) = 0 or V(t) = 0
                isPrime = true;
            }
            for (int i = 1; i < s; i++)
            {
                if (!isPrime)
                {
                    // doubling of index
                    lucas[1] = thisVal.BarrettReduction(lucas[1] * lucas[1], thisVal, constant);
                    lucas[1] = (lucas[1] - (lucas[2] << 1)) % thisVal;
                    //lucas[1] = ((lucas[1] * lucas[1]) - (lucas[2] << 1)) % thisVal;
                    if ((lucas[1].dataLength == 1 && lucas[1].data[0] == 0))
                        isPrime = true;
                }
                lucas[2] = thisVal.BarrettReduction(lucas[2] * lucas[2], thisVal, constant);     //Q^k
            }
            if (isPrime)     // additional checks for composite numbers
            {
                // If n is prime and gcd(n, Q) == 1, then
                // Q^((n+1)/2) = Q * Q^((n-1)/2) is congruent to (Q * J(Q, n)) mod n
                BigInteger g = thisVal.gcd(Q);
                if (g.dataLength == 1 && g.data[0] == 1)         // gcd(this, Q) == 1
                {
                    if ((lucas[2].data[maxLength - 1] & 0x80000000) != 0)
                        lucas[2] += thisVal;
                    BigInteger temp = (Q * BigInteger.Jacobi(Q, thisVal)) % thisVal;
                    if ((temp.data[maxLength - 1] & 0x80000000) != 0)
                        temp += thisVal;
                    if (lucas[2] != temp)
                        isPrime = false;
                }
            }
            return isPrime;
        }
        //***********************************************************************
        // Determines whether a number is probably prime, using the Rabin-Miller's
        // test.  Before applying the test, the number is tested for divisibility
        // by primes < 2000
        //
        // Returns true if number is probably prime.
        //***********************************************************************
        public bool isProbablePrime(int confidence)
        {
            BigInteger thisVal;
            if ((this.data[maxLength - 1] & 0x80000000) != 0)        // negative
                thisVal = -this;
            else
                thisVal = this;
            // test for divisibility by primes < 2000
            for (int p = 0; p < primesBelow2000.Length; p++)
            {
                BigInteger divisor = primesBelow2000[p];
                if (divisor >= thisVal)
                    break;
                BigInteger resultNum = thisVal % divisor;
                if (resultNum.IntValue() == 0)
                {
                    /*
    Console.WriteLine("Not prime!  Divisible by {0}\n",
                                      primesBelow2000[p]);
                    */
                    return false;
                }
            }
            if (thisVal.RabinMillerTest(confidence))
                return true;
            else
            {
                //Console.WriteLine("Not prime!  Failed primality test\n");
                return false;
            }
        }
        //***********************************************************************
        // Determines whether this BigInteger is probably prime using a
        // combination of base 2 strong pseudoprime test and Lucas strong
        // pseudoprime test.
        //
        // The sequence of the primality test is as follows,
        //
        // 1) Trial divisions are carried out using prime numbers below 2000.
        //    if any of the primes divides this BigInteger, then it is not prime.
        //
        // 2) Perform base 2 strong pseudoprime test.  If this BigInteger is a
        //    base 2 strong pseudoprime, proceed on to the next step.
        //
        // 3) Perform strong Lucas pseudoprime test.
        //
        // Returns True if this BigInteger is both a base 2 strong pseudoprime
        // and a strong Lucas pseudoprime.
        //
        // For a detailed discussion of this primality test, see [6].
        //
        //***********************************************************************
        public bool isProbablePrime()
        {
            BigInteger thisVal;
            if ((this.data[maxLength - 1] & 0x80000000) != 0)        // negative
                thisVal = -this;
            else
                thisVal = this;
            if (thisVal.dataLength == 1)
            {
                // test small numbers
                if (thisVal.data[0] == 0 || thisVal.data[0] == 1)
                    return false;
                else if (thisVal.data[0] == 2 || thisVal.data[0] == 3)
                    return true;
            }
            if ((thisVal.data[0] & 0x1) == 0)     // even numbers
                return false;
            // test for divisibility by primes < 2000
            for (int p = 0; p < primesBelow2000.Length; p++)
            {
                BigInteger divisor = primesBelow2000[p];
                if (divisor >= thisVal)
                    break;
                BigInteger resultNum = thisVal % divisor;
                if (resultNum.IntValue() == 0)
                {
                    //Console.WriteLine("Not prime!  Divisible by {0}\n",
                    //                  primesBelow2000[p]);
                    return false;
                }
            }
            // Perform BASE 2 Rabin-Miller Test
            // calculate values of s and t
            BigInteger p_sub1 = thisVal - (new BigInteger(1));
            int s = 0;
            for (int index = 0; index < p_sub1.dataLength; index++)
            {
                uint mask = 0x01;
                for (int i = 0; i < 32; i++)
                {
                    if ((p_sub1.data[index] & mask) != 0)
                    {
                        index = p_sub1.dataLength;      // to break the outer loop
                        break;
                    }
                    mask <<= 1;
                    s++;
                }
            }
            BigInteger t = p_sub1 >> s;
            int bits = thisVal.bitCount();
            BigInteger a = 2;
            // b = a^t mod p
            BigInteger b = a.modPow(t, thisVal);
            bool result = false;
            if (b.dataLength == 1 && b.data[0] == 1)         // a^t mod p = 1
                result = true;
            for (int j = 0; result == false && j < s; j++)
            {
                if (b == p_sub1)         // a^((2^j)*t) mod p = p-1 for some 0 <= j <= s-1
                {
                    result = true;
                    break;
                }
                b = (b * b) % thisVal;
            }
            // if number is strong pseudoprime to base 2, then do a strong lucas test
            if (result)
                result = LucasStrongTestHelper(thisVal);
            return result;
        }
        //***********************************************************************
        // Returns the lowest 4 bytes of the BigInteger as an int.
        //***********************************************************************
        public int IntValue()
        {
            return (int)data[0];
        }
        //***********************************************************************
        // Returns the lowest 8 bytes of the BigInteger as a long.
        //***********************************************************************
        public long LongValue()
        {
            long val = 0;
            val = (long)data[0];
            try
            {       // exception if maxLength = 1
                val |= (long)data[1] << 32;
            }
            catch (Exception)
            {
                if ((data[0] & 0x80000000) != 0) // negative
                    val = (int)data[0];
            }
            return val;
        }
        //***********************************************************************
        // Computes the Jacobi Symbol for a and b.
        // Algorithm adapted from [3] and [4] with some optimizations
        //***********************************************************************
        public static int Jacobi(BigInteger a, BigInteger b)
        {
            // Jacobi defined only for odd integers
            if ((b.data[0] & 0x1) == 0)
                throw (new ArgumentException("Jacobi defined only for odd integers."));
            if (a >= b) a %= b;
            if (a.dataLength == 1 && a.data[0] == 0) return 0;  // a == 0
            if (a.dataLength == 1 && a.data[0] == 1) return 1;  // a == 1
            if (a < 0)
            {
                if ((((b - 1).data[0]) & 0x2) == 0)       //if( (((b-1) >> 1).data[0] & 0x1) == 0)
                    return Jacobi(-a, b);
                else
                    return -Jacobi(-a, b);
            }
            int e = 0;
            for (int index = 0; index < a.dataLength; index++)
            {
                uint mask = 0x01;
                for (int i = 0; i < 32; i++)
                {
                    if ((a.data[index] & mask) != 0)
                    {
                        index = a.dataLength;      // to break the outer loop
                        break;
                    }
                    mask <<= 1;
                    e++;
                }
            }
            BigInteger a1 = a >> e;
            int s = 1;
            if ((e & 0x1) != 0 && ((b.data[0] & 0x7) == 3 || (b.data[0] & 0x7) == 5))
                s = -1;
            if ((b.data[0] & 0x3) == 3 && (a1.data[0] & 0x3) == 3)
                s = -s;
            if (a1.dataLength == 1 && a1.data[0] == 1)
                return s;
            else
                return (s * Jacobi(b % a1, a1));
        }
        //***********************************************************************
        // Generates a positive BigInteger that is probably prime.
        //***********************************************************************
        public static BigInteger genPseudoPrime(int bits, int confidence, Random rand)
        {
            BigInteger result = new BigInteger();
            bool done = false;
            while (!done)
            {
                result.genRandomBits(bits, rand);
                result.data[0] |= 0x01;     // make it odd
                // prime test
                done = result.isProbablePrime(confidence);
            }
            return result;
        }
        //***********************************************************************
        // Generates a random number with the specified number of bits such
        // that gcd(number, this) = 1
        //***********************************************************************
        public BigInteger genCoPrime(int bits, Random rand)
        {
            bool done = false;
            BigInteger result = new BigInteger();
            while (!done)
            {
                result.genRandomBits(bits, rand);
                //Console.WriteLine(result.ToString(16));
                // gcd test
                BigInteger g = result.gcd(this);
                if (g.dataLength == 1 && g.data[0] == 1)
                    done = true;
            }
            return result;
        }
        //***********************************************************************
        // Returns the modulo inverse of this.  Throws ArithmeticException if
        // the inverse does not exist.  (i.e. gcd(this, modulus) != 1)
        //***********************************************************************
        public BigInteger modInverse(BigInteger modulus)
        {
            BigInteger[] p = { 0, 1 };
            BigInteger[] q = new BigInteger[2];    // quotients
            BigInteger[] r = { 0, 0 };             // remainders
            int step = 0;
            BigInteger a = modulus;
            BigInteger b = this;
            while (b.dataLength > 1 || (b.dataLength == 1 && b.data[0] != 0))
            {
                BigInteger quotient = new BigInteger();
                BigInteger remainder = new BigInteger();
                if (step > 1)
                {
                    BigInteger pval = (p[0] - (p[1] * q[0])) % modulus;
                    p[0] = p[1];
                    p[1] = pval;
                }
                if (b.dataLength == 1)
                    singleByteDivide(a, b, quotient, remainder);
                else
                    multiByteDivide(a, b, quotient, remainder);
                /*
                Console.WriteLine(quotient.dataLength);
                Console.WriteLine("{0} = {1}({2}) + {3}  p = {4}", a.ToString(10),
                                  b.ToString(10), quotient.ToString(10), remainder.ToString(10),
                                  p[1].ToString(10));
                */
                q[0] = q[1];
                r[0] = r[1];
                q[1] = quotient; r[1] = remainder;
                a = b;
                b = remainder;
                step++;
            }
            if (r[0].dataLength > 1 || (r[0].dataLength == 1 && r[0].data[0] != 1))
                throw (new ArithmeticException("No inverse!"));
            BigInteger result = ((p[0] - (p[1] * q[0])) % modulus);
            if ((result.data[maxLength - 1] & 0x80000000) != 0)
                result += modulus;  // get the least positive modulus
            return result;
        }
        //***********************************************************************
        // Returns the value of the BigInteger as a byte array.  The lowest
        // index contains the MSB.
        //***********************************************************************
        public byte[] getBytes()
        {
            int numBits = bitCount();
            int numBytes = numBits >> 3;
            if ((numBits & 0x7) != 0)
                numBytes++;
            byte[] result = new byte[numBytes];
            //Console.WriteLine(result.Length);
            int pos = 0;
            uint tempVal, val = data[dataLength - 1];
            if ((tempVal = (val >> 24 & 0xFF)) != 0)
                result[pos++] = (byte)tempVal;
            if ((tempVal = (val >> 16 & 0xFF)) != 0)
                result[pos++] = (byte)tempVal;
            if ((tempVal = (val >> 8 & 0xFF)) != 0)
                result[pos++] = (byte)tempVal;
            if ((tempVal = (val & 0xFF)) != 0)
                result[pos++] = (byte)tempVal;
            for (int i = dataLength - 2; i >= 0; i--, pos += 4)
            {
                val = data[i];
                result[pos + 3] = (byte)(val & 0xFF);
                val >>= 8;
                result[pos + 2] = (byte)(val & 0xFF);
                val >>= 8;
                result[pos + 1] = (byte)(val & 0xFF);
                val >>= 8;
                result[pos] = (byte)(val & 0xFF);
            }
            return result;
        }
        //***********************************************************************
        // Sets the value of the specified bit to 1
        // The Least Significant Bit position is 0.
        //***********************************************************************
        public void setBit(uint bitNum)
        {
            uint bytePos = bitNum >> 5;             // divide by 32
            byte bitPos = (byte)(bitNum & 0x1F);    // get the lowest 5 bits
            uint mask = (uint)1 << bitPos;
            this.data[bytePos] |= mask;
            if (bytePos >= this.dataLength)
                this.dataLength = (int)bytePos + 1;
        }
        //***********************************************************************
        // Sets the value of the specified bit to 0
        // The Least Significant Bit position is 0.
        //***********************************************************************
        public void unsetBit(uint bitNum)
        {
            uint bytePos = bitNum >> 5;
            if (bytePos < this.dataLength)
            {
                byte bitPos = (byte)(bitNum & 0x1F);
                uint mask = (uint)1 << bitPos;
                uint mask2 = 0xFFFFFFFF ^ mask;
                this.data[bytePos] &= mask2;
                if (this.dataLength > 1 && this.data[this.dataLength - 1] == 0)
                    this.dataLength--;
            }
        }
        //***********************************************************************
        // Returns a value that is equivalent to the integer square root
        // of the BigInteger.
        //
        // The integer square root of "this" is defined as the largest integer n
        // such that (n * n) <= this
        //
        //***********************************************************************
        public BigInteger sqrt()
        {
            uint numBits = (uint)this.bitCount();
            if ((numBits & 0x1) != 0)        // odd number of bits
                numBits = (numBits >> 1) + 1;
            else
                numBits = (numBits >> 1);
            uint bytePos = numBits >> 5;
            byte bitPos = (byte)(numBits & 0x1F);
            uint mask;
            BigInteger result = new BigInteger();
            if (bitPos == 0)
                mask = 0x80000000;
            else
            {
                mask = (uint)1 << bitPos;
                bytePos++;
            }
            result.dataLength = (int)bytePos;
            for (int i = (int)bytePos - 1; i >= 0; i--)
            {
                while (mask != 0)
                {
                    // guess
                    result.data[i] ^= mask;
                    // undo the guess if its square is larger than this
                    if ((result * result) > this)
                        result.data[i] ^= mask;
                    mask >>= 1;
                }
                mask = 0x80000000;
            }
            return result;
        }
        //***********************************************************************
        // Returns the k_th number in the Lucas Sequence reduced modulo n.
        //
        // Uses index doubling to speed up the process.  For example, to calculate V(k),
        // we maintain two numbers in the sequence V(n) and V(n+1).
        //
        // To obtain V(2n), we use the identity
        //      V(2n) = (V(n) * V(n)) - (2 * Q^n)
        // To obtain V(2n+1), we first write it as
        //      V(2n+1) = V((n+1) + n)
        // and use the identity
        //      V(m+n) = V(m) * V(n) - Q * V(m-n)
        // Hence,
        //      V((n+1) + n) = V(n+1) * V(n) - Q^n * V((n+1) - n)
        //                   = V(n+1) * V(n) - Q^n * V(1)
        //                   = V(n+1) * V(n) - Q^n * P
        //
        // We use k in its binary expansion and perform index doubling for each
        // bit position.  For each bit position that is set, we perform an
        // index doubling followed by an index addition.  This means that for V(n),
        // we need to update it to V(2n+1).  For V(n+1), we need to update it to
        // V((2n+1)+1) = V(2*(n+1))
        //
        // This function returns
        // [0] = U(k)
        // [1] = V(k)
        // [2] = Q^n
        //
        // Where U(0) = 0 % n, U(1) = 1 % n
        //       V(0) = 2 % n, V(1) = P % n
        //***********************************************************************
        public static BigInteger[] LucasSequence(BigInteger P, BigInteger Q,
                                                 BigInteger k, BigInteger n)
        {
            if (k.dataLength == 1 && k.data[0] == 0)
            {
                BigInteger[] result = new BigInteger[3];
                result[0] = 0; result[1] = 2 % n; result[2] = 1 % n;
                return result;
            }
            // calculate constant = b^(2k) / m
            // for Barrett Reduction
            BigInteger constant = new BigInteger();
            int nLen = n.dataLength << 1;
            constant.data[nLen] = 0x00000001;
            constant.dataLength = nLen + 1;
            constant = constant / n;
            // calculate values of s and t
            int s = 0;
            for (int index = 0; index < k.dataLength; index++)
            {
                uint mask = 0x01;
                for (int i = 0; i < 32; i++)
                {
                    if ((k.data[index] & mask) != 0)
                    {
                        index = k.dataLength;      // to break the outer loop
                        break;
                    }
                    mask <<= 1;
                    s++;
                }
            }
            BigInteger t = k >> s;
            //Console.WriteLine("s = " + s + " t = " + t);
            return LucasSequenceHelper(P, Q, t, n, constant, s);
        }
        //***********************************************************************
        // Performs the calculation of the kth term in the Lucas Sequence.
        // For details of the algorithm, see reference [9].
        //
        // k must be odd.  i.e LSB == 1
        //***********************************************************************
        private static BigInteger[] LucasSequenceHelper(BigInteger P, BigInteger Q,
                                                        BigInteger k, BigInteger n,
                                                        BigInteger constant, int s)
        {
            BigInteger[] result = new BigInteger[3];
            if ((k.data[0] & 0x00000001) == 0)
                throw (new ArgumentException("Argument k must be odd."));
            int numbits = k.bitCount();
            uint mask = (uint)0x1 << ((numbits & 0x1F) - 1);
            // v = v0, v1 = v1, u1 = u1, Q_k = Q^0
            BigInteger v = 2 % n, Q_k = 1 % n,
                       v1 = P % n, u1 = Q_k;
            bool flag = true;
            for (int i = k.dataLength - 1; i >= 0; i--)     // iterate on the binary expansion of k
            {
                //Console.WriteLine("round");
                while (mask != 0)
                {
                    if (i == 0 && mask == 0x00000001)        // last bit
                        break;
                    if ((k.data[i] & mask) != 0)             // bit is set
                    {
                        // index doubling with addition
                        u1 = (u1 * v1) % n;
                        v = ((v * v1) - (P * Q_k)) % n;
                        v1 = n.BarrettReduction(v1 * v1, n, constant);
                        v1 = (v1 - ((Q_k * Q) << 1)) % n;
                        if (flag)
                            flag = false;
                        else
                            Q_k = n.BarrettReduction(Q_k * Q_k, n, constant);
                        Q_k = (Q_k * Q) % n;
                    }
                    else
                    {
                        // index doubling
                        u1 = ((u1 * v) - Q_k) % n;
                        v1 = ((v * v1) - (P * Q_k)) % n;
                        v = n.BarrettReduction(v * v, n, constant);
                        v = (v - (Q_k << 1)) % n;
                        if (flag)
                        {
                            Q_k = Q % n;
                            flag = false;
                        }
                        else
                            Q_k = n.BarrettReduction(Q_k * Q_k, n, constant);
                    }
                    mask >>= 1;
                }
                mask = 0x80000000;
            }
            // at this point u1 = u(n+1) and v = v(n)
            // since the last bit always 1, we need to transform u1 to u(2n+1) and v to v(2n+1)
            u1 = ((u1 * v) - Q_k) % n;
            v = ((v * v1) - (P * Q_k)) % n;
            if (flag)
                flag = false;
            else
                Q_k = n.BarrettReduction(Q_k * Q_k, n, constant);
            Q_k = (Q_k * Q) % n;
            for (int i = 0; i < s; i++)
            {
                // index doubling
                u1 = (u1 * v) % n;
                v = ((v * v) - (Q_k << 1)) % n;
                if (flag)
                {
                    Q_k = Q % n;
                    flag = false;
                }
                else
                    Q_k = n.BarrettReduction(Q_k * Q_k, n, constant);
            }
            result[0] = u1;
            result[1] = v;
            result[2] = Q_k;
            return result;
        }
        //***********************************************************************
        // Tests the correct implementation of the /, %, * and + operators
        //***********************************************************************
        public static void MulDivTest(int rounds)
        {
            Random rand = new Random();
            byte[] val = new byte[64];
            byte[] val2 = new byte[64];
            for (int count = 0; count < rounds; count++)
            {
                // generate 2 numbers of random length
                int t1 = 0;
                while (t1 == 0)
                    t1 = (int)(rand.NextDouble() * 65);
                int t2 = 0;
                while (t2 == 0)
                    t2 = (int)(rand.NextDouble() * 65);
                bool done = false;
                while (!done)
                {
                    for (int i = 0; i < 64; i++)
                    {
                        if (i < t1)
                            val[i] = (byte)(rand.NextDouble() * 256);
                        else
                            val[i] = 0;
                        if (val[i] != 0)
                            done = true;
                    }
                }
                done = false;
                while (!done)
                {
                    for (int i = 0; i < 64; i++)
                    {
                        if (i < t2)
                            val2[i] = (byte)(rand.NextDouble() * 256);
                        else
                            val2[i] = 0;
                        if (val2[i] != 0)
                            done = true;
                    }
                }
                while (val[0] == 0)
                    val[0] = (byte)(rand.NextDouble() * 256);
                while (val2[0] == 0)
                    val2[0] = (byte)(rand.NextDouble() * 256);
                Console.WriteLine(count);
                BigInteger bn1 = new BigInteger(val, t1);
                BigInteger bn2 = new BigInteger(val2, t2);
                // Determine the quotient and remainder by dividing
                // the first number by the second.
                BigInteger bn3 = bn1 / bn2;
                BigInteger bn4 = bn1 % bn2;
                // Recalculate the number
                BigInteger bn5 = (bn3 * bn2) + bn4;
                // Make sure they're the same
                if (bn5 != bn1)
                {
                    Console.WriteLine("Error at " + count);
                    Console.WriteLine(bn1 + "\n");
                    Console.WriteLine(bn2 + "\n");
                    Console.WriteLine(bn3 + "\n");
                    Console.WriteLine(bn4 + "\n");
                    Console.WriteLine(bn5 + "\n");
                    return;
                }
            }
        }
        //***********************************************************************
        // Tests the correct implementation of the modulo exponential function
        // using RSA encryption and decryption (using pre-computed encryption and
        // decryption keys).
        //***********************************************************************
        public static void RSATest(int rounds)
        {
            Random rand = new Random(1);
            byte[] val = new byte[64];
            // private and public key
            BigInteger bi_e = new BigInteger("a932b948feed4fb2b692609bd22164fc9edb59fae7880cc1eaff7b3c9626b7e5b241c27a974833b2622ebe09beb451917663d47232488f23a117fc97720f1e7", 16);
            BigInteger bi_d = new BigInteger("4adf2f7a89da93248509347d2ae506d683dd3a16357e859a980c4f77a4e2f7a01fae289f13a851df6e9db5adaa60bfd2b162bbbe31f7c8f828261a6839311929d2cef4f864dde65e556ce43c89bbbf9f1ac5511315847ce9cc8dc92470a747b8792d6a83b0092d2e5ebaf852c85cacf34278efa99160f2f8aa7ee7214de07b7", 16);
            BigInteger bi_n = new BigInteger("e8e77781f36a7b3188d711c2190b560f205a52391b3479cdb99fa010745cbeba5f2adc08e1de6bf38398a0487c4a73610d94ec36f17f3f46ad75e17bc1adfec99839589f45f95ccc94cb2a5c500b477eb3323d8cfab0c8458c96f0147a45d27e45a4d11d54d77684f65d48f15fafcc1ba208e71e921b9bd9017c16a5231af7f", 16);
            Console.WriteLine("e =\n" + bi_e.ToString(10));
            Console.WriteLine("\nd =\n" + bi_d.ToString(10));
            Console.WriteLine("\nn =\n" + bi_n.ToString(10) + "\n");
            for (int count = 0; count < rounds; count++)
            {
                // generate data of random length
                int t1 = 0;
                while (t1 == 0)
                    t1 = (int)(rand.NextDouble() * 65);
                bool done = false;
                while (!done)
                {
                    for (int i = 0; i < 64; i++)
                    {
                        if (i < t1)
                            val[i] = (byte)(rand.NextDouble() * 256);
                        else
                            val[i] = 0;
                        if (val[i] != 0)
                            done = true;
                    }
                }
                while (val[0] == 0)
                    val[0] = (byte)(rand.NextDouble() * 256);
                Console.Write("Round = " + count);
                // encrypt and decrypt data
                BigInteger bi_data = new BigInteger(val, t1);
                BigInteger bi_encrypted = bi_data.modPow(bi_e, bi_n);
                BigInteger bi_decrypted = bi_encrypted.modPow(bi_d, bi_n);
                // compare
                if (bi_decrypted != bi_data)
                {
                    Console.WriteLine("\nError at round " + count);
                    Console.WriteLine(bi_data + "\n");
                    return;
                }
                Console.WriteLine(" <PASSED>.");
            }
        }
        //***********************************************************************
        // Tests the correct implementation of the modulo exponential and
        // inverse modulo functions using RSA encryption and decryption.  The two
        // pseudoprimes p and q are fixed, but the two RSA keys are generated
        // for each round of testing.
        //***********************************************************************
        public static void RSATest2(int rounds)
        {
            Random rand = new Random();
            byte[] val = new byte[64];
            byte[] pseudoPrime1 = {
                        (byte)0x85, (byte)0x84, (byte)0x64, (byte)0xFD, (byte)0x70, (byte)0x6A,
                        (byte)0x9F, (byte)0xF0, (byte)0x94, (byte)0x0C, (byte)0x3E, (byte)0x2C,
                        (byte)0x74, (byte)0x34, (byte)0x05, (byte)0xC9, (byte)0x55, (byte)0xB3,
                        (byte)0x85, (byte)0x32, (byte)0x98, (byte)0x71, (byte)0xF9, (byte)0x41,
                        (byte)0x21, (byte)0x5F, (byte)0x02, (byte)0x9E, (byte)0xEA, (byte)0x56,
                        (byte)0x8D, (byte)0x8C, (byte)0x44, (byte)0xCC, (byte)0xEE, (byte)0xEE,
                        (byte)0x3D, (byte)0x2C, (byte)0x9D, (byte)0x2C, (byte)0x12, (byte)0x41,
                        (byte)0x1E, (byte)0xF1, (byte)0xC5, (byte)0x32, (byte)0xC3, (byte)0xAA,
                        (byte)0x31, (byte)0x4A, (byte)0x52, (byte)0xD8, (byte)0xE8, (byte)0xAF,
                        (byte)0x42, (byte)0xF4, (byte)0x72, (byte)0xA1, (byte)0x2A, (byte)0x0D,
                        (byte)0x97, (byte)0xB1, (byte)0x31, (byte)0xB3,
                };
            byte[] pseudoPrime2 = {
                        (byte)0x99, (byte)0x98, (byte)0xCA, (byte)0xB8, (byte)0x5E, (byte)0xD7,
                        (byte)0xE5, (byte)0xDC, (byte)0x28, (byte)0x5C, (byte)0x6F, (byte)0x0E,
                        (byte)0x15, (byte)0x09, (byte)0x59, (byte)0x6E, (byte)0x84, (byte)0xF3,
                        (byte)0x81, (byte)0xCD, (byte)0xDE, (byte)0x42, (byte)0xDC, (byte)0x93,
                        (byte)0xC2, (byte)0x7A, (byte)0x62, (byte)0xAC, (byte)0x6C, (byte)0xAF,
                        (byte)0xDE, (byte)0x74, (byte)0xE3, (byte)0xCB, (byte)0x60, (byte)0x20,
                        (byte)0x38, (byte)0x9C, (byte)0x21, (byte)0xC3, (byte)0xDC, (byte)0xC8,
                        (byte)0xA2, (byte)0x4D, (byte)0xC6, (byte)0x2A, (byte)0x35, (byte)0x7F,
                        (byte)0xF3, (byte)0xA9, (byte)0xE8, (byte)0x1D, (byte)0x7B, (byte)0x2C,
                        (byte)0x78, (byte)0xFA, (byte)0xB8, (byte)0x02, (byte)0x55, (byte)0x80,
                        (byte)0x9B, (byte)0xC2, (byte)0xA5, (byte)0xCB,
                };
            BigInteger bi_p = new BigInteger(pseudoPrime1);
            BigInteger bi_q = new BigInteger(pseudoPrime2);
            BigInteger bi_pq = (bi_p - 1) * (bi_q - 1);
            BigInteger bi_n = bi_p * bi_q;
            for (int count = 0; count < rounds; count++)
            {
                // generate private and public key
                BigInteger bi_e = bi_pq.genCoPrime(512, rand);
                BigInteger bi_d = bi_e.modInverse(bi_pq);
                Console.WriteLine("\ne =\n" + bi_e.ToString(10));
                Console.WriteLine("\nd =\n" + bi_d.ToString(10));
                Console.WriteLine("\nn =\n" + bi_n.ToString(10) + "\n");
                // generate data of random length
                int t1 = 0;
                while (t1 == 0)
                    t1 = (int)(rand.NextDouble() * 65);
                bool done = false;
                while (!done)
                {
                    for (int i = 0; i < 64; i++)
                    {
                        if (i < t1)
                            val[i] = (byte)(rand.NextDouble() * 256);
                        else
                            val[i] = 0;
                        if (val[i] != 0)
                            done = true;
                    }
                }
                while (val[0] == 0)
                    val[0] = (byte)(rand.NextDouble() * 256);
                Console.Write("Round = " + count);
                // encrypt and decrypt data
                BigInteger bi_data = new BigInteger(val, t1);
                BigInteger bi_encrypted = bi_data.modPow(bi_e, bi_n);
                BigInteger bi_decrypted = bi_encrypted.modPow(bi_d, bi_n);
                // compare
                if (bi_decrypted != bi_data)
                {
                    Console.WriteLine("\nError at round " + count);
                    Console.WriteLine(bi_data + "\n");
                    return;
                }
                Console.WriteLine(" <PASSED>.");
            }
        }
        //***********************************************************************
        // Tests the correct implementation of sqrt() method.
        //***********************************************************************
        public static void SqrtTest(int rounds)
        {
            Random rand = new Random();
            for (int count = 0; count < rounds; count++)
            {
                // generate data of random length
                int t1 = 0;
                while (t1 == 0)
                    t1 = (int)(rand.NextDouble() * 1024);
                Console.Write("Round = " + count);
                BigInteger a = new BigInteger();
                a.genRandomBits(t1, rand);
                BigInteger b = a.sqrt();
                BigInteger c = (b + 1) * (b + 1);
                // check that b is the largest integer such that b*b <= a
                if (c <= a)
                {
                    Console.WriteLine("\nError at round " + count);
                    Console.WriteLine(a + "\n");
                    return;
                }
                Console.WriteLine(" <PASSED>.");
            }
        }
    }
}
ZigbeeApp/Shared.Droid/Encryption/DES.cs
New file
@@ -0,0 +1,75 @@
using System;
using System.Text;
using System.Security.Cryptography;
using System.IO;
namespace Shared.Encryption
{
    public  class DES
    {
        //<summary><![CDATA[字符串DES加密函数]]></summary>
        //<param name="str"><![CDATA[被加密字符串 ]]></param>
        //<param name="key"><![CDATA[密钥 ]]></param> 
        //<returns><![CDATA[加密后字符串,error开头表示错误]]></returns>   
        public static string Encode(string str, string key)
        {
            try
            {
                var provider = new DESCryptoServiceProvider();
                provider.Key = Encoding.ASCII.GetBytes(key.Substring(0, key.Length < 8 ? key.Length : 8));
                provider.IV = Encoding.ASCII.GetBytes(key.Substring(0, key.Length < 8 ? key.Length : 8));
                var bytes = Encoding.UTF8.GetBytes(str);
                using (var stream = new MemoryStream())
                {
                    var stream2 = new CryptoStream(stream, provider.CreateEncryptor(), CryptoStreamMode.Write);
                    stream2.Write(bytes, 0, bytes.Length);
                    stream2.FlushFinalBlock();
                    var builder = new StringBuilder();
                    foreach (byte num in stream.ToArray())
                    {
                        builder.AppendFormat("{0:X2}", num);
                    }
                    return builder.ToString();
                }
            }
            catch (Exception)
            {
                return "error:加密失败!";
            }
        }
        //<summary><![CDATA[字符串DES解密函数]]></summary>
        //<param name="str"><![CDATA[被解密字符串 ]]></param>
        //<param name="key"><![CDATA[密钥 ]]></param> 
        //<returns><![CDATA[解密后字符串,error开头是出错]]></returns>   
        public static string Decode(string str, string key)
        {
            try
            {
                var provider = new DESCryptoServiceProvider();
                // å¯†é’¥
                provider.Key = Encoding.ASCII.GetBytes(key.Substring(0, key.Length < 8 ? key.Length : 8));
                // åç§»é‡
                provider.IV = Encoding.ASCII.GetBytes(key.Substring(0, key.Length < 8 ? key.Length : 8));
                var buffer = new byte[str.Length / 2];
                for (int i = 0; i < (str.Length / 2); i++)
                {
                    int num2 = Convert.ToInt32(str.Substring(i * 2, 2), 0x10);
                    buffer[i] = (byte)num2;
                }
                using (var stream = new MemoryStream())
                {
                    var stream2 = new CryptoStream(stream, provider.CreateDecryptor(), CryptoStreamMode.Write);
                    stream2.Write(buffer, 0, buffer.Length);
                    stream2.FlushFinalBlock();
                    stream.Close();
                    return Encoding.UTF8.GetString(stream.ToArray());
                }
            }
            catch (Exception)
            {
                return "error:解密失败!";
            }
        }
    }
}
ZigbeeApp/Shared.Droid/Encryption/RSA.cs
New file
@@ -0,0 +1,42 @@
using System;
namespace Shared.Encryption
{
    public class RSA
    {
        /// <summary>
        /// ç”¨æŒ‡å®šçš„密匙加密
        /// </summary>
        /// <param name="source">明文</param>
        /// <param name="e">可以是RSACryptoServiceProvider生成的E</param>
        /// <param name="n">可以是RSACryptoServiceProvider生成的Modulus</param>
        /// <returns>返回密文</returns>
        public static string EncryptString(string source, BigInteger e, BigInteger n)
        {
            int len = source.Length;
            int len1 = 0;
            int blockLen = 0;
            if ((len % 128) == 0)
                len1 = len / 128;
            else
                len1 = len / 128 + 1;
            string block = "";
            var result = new System.Text.StringBuilder();
            for (int i = 0; i < len1; i++)
            {
                if (len >= 128)
                    blockLen = 128;
                else
                    blockLen = len;
                block = source.Substring(i * 128, blockLen);
                byte[] oText = System.Text.Encoding.UTF8.GetBytes(block);
                var biText = new BigInteger(oText);
                var biEnText = biText.modPow(e, n);
                var temp = biEnText.ToHexString();
                result.Append(temp).Append("@");
                len -= blockLen;
            }
            return result.ToString().TrimEnd('@');
        }
    }
}
ZigbeeApp/Shared.Droid/IO/FileUtils.cs
New file
@@ -0,0 +1,261 @@
using System;
using System.IO;
namespace Shared.IO
{
    public static class FileUtils
    {
        public static void DeleteFile(string path)
        {
            System.IO.File.Delete(path);
        }
        public static System.IO.Stream GetStreamFromResource(string path)
        {
            return Application.Activity.Assets.Open(path);
        }
        public static readonly string RootPath = Application.RootPath;
        /// <summary>
        /// Writes the file by bytes.
        /// </summary>
        /// <returns><c>true</c>, if file by bytes was writed, <c>false</c> otherwise.</returns>
        /// <param name="fileName">File name.</param>
        /// <param name="bytes">Bytes.</param>
        public static bool WriteFileByBytes(string fileName, byte[] bytes)
        {
            if (fileName == null || (fileName = fileName.Trim()) == (""))
            {
                return false;
            }
            System.IO.FileStream fs = null;
            try
            {
                fs = new FileStream(System.IO.Path.Combine(RootPath, fileName), FileMode.Create, FileAccess.Write);
                fs.Write(bytes, 0, bytes.Length);
                fs.Flush();
                return true;
            }
            catch
            {
                return false;
            }
            finally
            {
                try
                {
                    if (fs != null)
                    {
                        fs.Close();
                    }
                }
                catch
                {
                }
            }
        }
        /// <summary>
        /// Writes the file by input stream.
        /// </summary>
        /// <returns><c>true</c>, if file by input stream was writed, <c>false</c> otherwise.</returns>
        /// <param name="fileName">File name.</param>
        /// <param name="inputStream">Input stream.</param>
        /// <param name="isNeedRootPath">If set to <c>true</c> is need root path.</param>
        public static bool WriteFileByInputStream(string fileName, System.IO.Stream inputStream)
        {
            if (fileName == null || (fileName = fileName.Trim()) == (""))
            {
                return false;
            }
            try
            {
                var fs = new FileStream(System.IO.Path.Combine(RootPath, fileName), FileMode.Create, FileAccess.Write);
                byte[] buffer = new byte[4 * 1024];
                int length = 0;
                while ((length = inputStream.Read(buffer, 0, buffer.Length)) != 0)
                {
                    fs.Write(buffer, 0, length);
                    fs.Flush();
                }
                fs.Close();
                System.Console.WriteLine(fileName);
                return true;
            }
            catch
            {
                return false;
            }
        }
        /// <summary>
        /// è¯»å–图片文件路径
        /// </summary>
        /// <returns>The file.</returns>
        /// <param name="fileName">File name.</param>
        public static string GetImageFilePath(string fileName)
        {
            if (fileName == null)
            {
                return "";
            }
            if (System.IO.File.Exists( fileName))
            {
                return fileName;
            }
            // å…ˆæ‰¾æ˜¯å¦æ˜¯ç”¨æˆ·å·²ç»æ›´æ”¹è¿‡çš„图片,这个是优先选择
            if (System.IO.File.Exists(System.IO.Path.Combine(Application.RootPath, fileName)))
            {
                return System.IO.Path.Combine(Application.RootPath, fileName);
            }
            string newFileName = null;
            if (Application.Skin == null)
            {
                newFileName = "Phone/" + fileName;
            }
            else
            {
                newFileName = Application.Skin + "/" + fileName;
            }
            //data ç›®å½•下查找 ï¼Œæœ‰å¯èƒ½æ˜¯å¤šçš®è‚¤çš„æ•°æ®
            if (System.IO.File.Exists(System.IO.Path.Combine(Application.RootPath, newFileName)))
            {
                return System.IO.Path.Combine(Application.RootPath, newFileName);
            }
            return "";
        }
        /// <summary>
        /// read file
        /// </summary>
        /// <returns>The file.</returns>
        /// <param name="fileName">File name.</param>
        public static byte[] ReadImage11111(string fileName)
        {
            string tempFileName = fileName;
            {
                fileName = "Phone/" + fileName;
            }
            System.IO.FileStream fs = null;
            try
            {
                if (System.IO.File.Exists(System.IO.Path.Combine(RootPath, tempFileName)))
                {
                    fs = new FileStream(System.IO.Path.Combine(RootPath, tempFileName), FileMode.Open, FileAccess.Read);
                }
                else if (System.IO.File.Exists(fileName))
                {
                    fs = new FileStream(fileName, FileMode.Open, FileAccess.Read);
                }
                else
                {
                    return new byte[0];
                }
                byte[] bytes = new byte[fs.Length];
                fs.Read(bytes, 0, bytes.Length);
                return bytes;
            }
            catch
            {
                return new byte[0];
            }
            finally
            {
                try
                {
                    if (fs != null)
                    {
                        fs.Close();
                    }
                }
                catch
                {
                }
            }
        }
        public static System.Collections.Generic.List<string> ReadStringList(string fileName, System.Text.Encoding encoding)
        {
            System.Collections.Generic.List<string> stringList = new System.Collections.Generic.List<string>();
            System.IO.StreamReader fs = null;
            try
            {
                if (System.IO.File.Exists(System.IO.Path.Combine(RootPath, fileName)))
                {
                    fs = new StreamReader(System.IO.Path.Combine(RootPath, fileName), encoding);
                }
                else if (System.IO.File.Exists(fileName))
                {
                    fs = new StreamReader(fileName, encoding);
                }
                else
                {
                    return stringList;
                }
                string s;
                while (null != (s = fs.ReadLine()))
                {
                    stringList.Add(s);
                }
                return stringList;
            }
            catch
            {
                return stringList;
            }
            finally
            {
                if (fs != null)
                {
                    fs.Close();
                }
            }
        }
        public static byte[] ReadFile(string fileName)
        {
            System.IO.FileStream fs = null;
            try
            {
                if (System.IO.File.Exists(System.IO.Path.Combine(RootPath, fileName)))
                {
                    fs = new FileStream(System.IO.Path.Combine(RootPath, fileName), FileMode.Open, FileAccess.Read);
                }
                else if (System.IO.File.Exists(fileName))
                {
                    fs = new FileStream(fileName, FileMode.Open, FileAccess.Read);
                }
                else
                {
                    return new byte[0];
                }
                byte[] bytes = new byte[fs.Length];
                fs.Read(bytes, 0, bytes.Length);
                return bytes;
            }
            catch
            {
                return new byte[0];
            }
            finally
            {
                if (fs != null)
                {
                    fs.Close();
                }
            }
        }
    }
}
ZigbeeApp/Shared.Droid/Jars/AboutJars.txt
New file
@@ -0,0 +1,37 @@
This directory is for Android .jars.
There are 4 types of jars that are supported:
== Input Jar and Embedded Jar ==
This is the jar that bindings should be generated for.
For example, if you were binding the Google Maps library, this would
be Google's "maps.jar".
The difference between EmbeddedJar and InputJar is, EmbeddedJar is to be
embedded in the resulting dll as EmbeddedResource, while InputJar is not.
There are couple of reasons you wouldn't like to embed the target jar
in your dll (the ones that could be internally loaded by <uses-library>
feature e.g. maps.jar, or you cannot embed jars that are under some
proprietary license).
Set the build action for these jars in the properties page to "InputJar".
== Reference Jar and Embedded Reference Jar ==
These are jars that are referenced by the input jar.  C# bindings will
not be created for these jars.  These jars will be used to resolve
types used by the input jar.
NOTE: Do not add "android.jar" as a reference jar.  It will be added automatically
based on the Target Framework selected.
Set the build action for these jars in the properties page to "ReferenceJar".
"EmbeddedJar" works like "ReferenceJar", but like "EmbeddedJar", it is
embedded in your dll. But at application build time, they are not included
in the final apk, like ReferenceJar files.
ZigbeeApp/Shared.Droid/Jars/EzvizGlobalAPI.jar
Binary files differ
ZigbeeApp/Shared.Droid/Jars/HDLArcSeekbar-release.aar
Binary files differ
ZigbeeApp/Shared.Droid/Jars/MyJar.jar
Binary files differ
ZigbeeApp/Shared.Droid/Jars/libammsdk.jar
Binary files differ
ZigbeeApp/Shared.Droid/MyBroadcastReceive.cs
New file
@@ -0,0 +1,100 @@
using System;
using Android.App;
using Android.Content;
using Android.Net;
using Android.Telephony;
namespace Shared
{
    public class MyBroadcastReceive : BroadcastReceiver
    {
        /// <summary>
        /// å“é“ƒäº‹ä»¶
        /// </summary>
        public static Action ActioRinging;
        /// <summary>
        /// ç”µè¯æŒ‚断事件
        /// </summary>
        public static Action ActionIdle;
        /// <summary>
        /// æ˜¯å¦åœ¨é€šè¯ä¸­
        /// </summary>
        public static bool IsCalling;
        public override void OnReceive (Context context, Intent intent)
        {
            //return;
                System.Console.WriteLine ($"接收到广播事:{intent.Action}");
                switch (intent.Action) {
                // å¦‚果是拨打电话
                case "android.intent.action.NEW_OUTGOING_CALL": {
                        System.Console.WriteLine ($"播打电话->{intent.GetStringExtra (Intent.ExtraPhoneNumber)}");
                    }
                    break;
                //被打电话
                case "android.intent.action.PHONE_STATE": {
                        // å¦‚果是来电
                        var tManager = (TelephonyManager)context.GetSystemService (Service.TelephonyService);
                        System.Console.WriteLine ($"通话状态->{tManager.CallState}");
                        switch (tManager.CallState) {
                        //响铃
                        case CallState.Ringing:
                            IsCalling = true;
                            var mIncomingNumber = intent.GetStringExtra ("incoming_number");
                            ActioRinging?.Invoke ();
                            break;
                        //接通
                        case CallState.Offhook:
                            IsCalling = true;
                            ActioRinging?.Invoke ();
                            break;
                        //挂断电话
                        case CallState.Idle:
                            IsCalling = false;
                            ActionIdle?.Invoke ();
                            break;
                        }
                        break;
                    }
                case "android.net.conn.CONNECTIVITY_CHANGE":
                    if (intent.Extras != null) {
                        var ni = (NetworkInfo)intent.Extras.Get (ConnectivityManager.ExtraNetworkInfo);
                        if (ni != null && ni.GetState () == NetworkInfo.State.Connected) {
                            //可以再这里进行一些网络突然断开未完成的操作
                            System.Console.WriteLine ($"网络变化:{ni.GetState ()}");
                            var type = getConnectedType (context);
                            if (type == 2)
                            {
                                Application.IsWifi = true;
                            }
                            else {
                                Application.IsWifi = false;
                            }
                            BaseActivity.NetworkStateChanged?.Invoke (type);
                        }
                    }
                    break;
                }
        }
        int getConnectedType (Context context)
        {
            if (context != null) {
                var mConnectivityManager = (ConnectivityManager)context.GetSystemService (Context.ConnectivityService);
                if (mConnectivityManager == null) {
                    return 0;
                }
                var mNetworkInfo = mConnectivityManager.ActiveNetworkInfo;
                if (mNetworkInfo != null && mNetworkInfo.IsAvailable) {
                    switch (mNetworkInfo.Type) {
                    case ConnectivityType.Mobile:
                        return 1;
                    case ConnectivityType.Wifi:
                        return 2;
                    }
                }
            }
            return 0;
        }
    }
}
ZigbeeApp/Shared.Droid/MyService.cs
New file
@@ -0,0 +1,199 @@
using System;
using Android;
using Android.App;
using Android.Content;
using Android.Content.PM;
using Android.Locations;
using Android.OS;
using Android.Runtime;
using Android.Widget;
namespace Shared
{
    /// <summary>
    /// GPS åŽå°å®šä½
    /// </summary>
    [Service]
    public class GPSLocationService:Service
    {
        public override IBinder OnBind(Intent intent)
        {
            return null;
        }
        public override void OnCreate()
        {
            base.OnCreate();
            if (BaseActivity.IsEnnableGPS)
            {
                (Shared.Application.Activity as BaseActivity).SetGPSLocationPermission(result =>
                {
                    if (result)
                    {
                        initLocation();
                        notification();
                    }
                });
            }
        }
        [Obsolete]
        void notification()
        {
            if (Android.OS.Build.VERSION.SdkInt >= BuildVersionCodes.O)
            {
                var mNotificationUtils = new NotificationUtils(this);
                var notificationIntent = new Intent(this, typeof(BaseActivity));
                var pendingIntent = PendingIntent.GetActivity(this, 3,
                        notificationIntent, PendingIntentFlags.CancelCurrent);
                var builder = mNotificationUtils.getAndroidChannelNotification
                        (Language.CurrentLanguage == "Chinese"?"获取定位信息":"Get Location Information", "", pendingIntent);
                StartForeground(1, builder.Build());//id must not be 0,即禁止是0
            }
        }
        class NotificationUtils :Notification.Builder
        {
            private NotificationManager mManager;
            public static string channelId = "85521566";
            public static string channelName = "HDLChanneName";
            private Context context;
            [Obsolete]
            public NotificationUtils(Context context) : base(context)
            {
                this.context = context;
                createChannels();
            }
            public void createChannels()
            {
                // create android channel
                if (Android.OS.Build.VERSION.SdkInt >= BuildVersionCodes.O)
                {
                    var androidChannel = new NotificationChannel(channelId,
                              context.PackageName, NotificationImportance.High);
                    // Sets whether notifications posted to this channel should display notification lights
                    androidChannel.EnableLights(false);
                    // Sets whether notification posted to this channel should vibrate.
                    androidChannel.EnableVibration(false);
                    androidChannel.SetVibrationPattern(new long[] { 0 });
                    // Sets the notification light color for notifications posted to this channel
                    androidChannel.LightColor = 0x38FF1234;
                    // Sets whether notifications posted to this channel appear on the lockscreen or not
                    androidChannel.LockscreenVisibility = NotificationVisibility.Private;
                    getManager().CreateNotificationChannel(androidChannel);
                }
            }
            private NotificationManager getManager()
            {
                if (mManager == null)
                {
                    mManager = (NotificationManager)context.GetSystemService(NotificationService);
                }
                return mManager;
            }
            public Notification.Builder getAndroidChannelNotification(string title, string body, PendingIntent pendingIntent)
            {
                if (Android.OS.Build.VERSION.SdkInt >= BuildVersionCodes.O)
                {
                    return new Notification.Builder(context, channelId)
                            .SetContentTitle(title)
                            .SetContentText(body)
                            .SetContentIntent(pendingIntent)
                            .SetSmallIcon(Android.Graphics.Drawables.Icon.CreateWithBitmap( ((Android.Graphics.Drawables.BitmapDrawable)context.PackageManager.GetApplicationIcon(context.PackageManager.GetApplicationInfo(context.PackageName,0))).Bitmap))//android.R.drawable.stat_notify_more
                            //.SetWhen(System.DateTime.Now.Ticks)
                            .SetOngoing(true)
                            .SetChannelId(channelId)
                            .SetAutoCancel(true);
                }
                else
                {
                    return new Notification.Builder(context, channelId);
                }
            }
        }
        #region GPS定位
        LocationManager locationManager;
        /// <summary>
        /// åˆå§‹åŒ–定位服务
        /// </summary>
        void initLocation()
        {
            //GPS初始化
            locationManager = GetSystemService(LocationService).JavaCast<LocationManager>();
            // åˆ¤æ–­GPS是否正常启动
            if (!locationManager.IsProviderEnabled(LocationManager.GpsProvider))
            {
                if (Language.CurrentLanguage == "Chinese")
                {
                    Toast.MakeText(this, "请打开GPS...", ToastLength.Long).Show();
                }
                else
                {
                    Toast.MakeText(this, "Please open GPS...", ToastLength.Long).Show();
                }
            }
            else
            {
                locationManager.RequestLocationUpdates(LocationManager.GpsProvider, 60 * 1000, 1000, new locationChange { });
            }
        }
        class locationChange : Java.Lang.Object, Android.Locations.ILocationListener
        {
            public void OnLocationChanged(Location location)
            {
                Shared.Application.LocationAction?.Invoke(location.Longitude, location.Latitude);
            }
            public void OnProviderDisabled(string provider)
            {
            }
            public void OnProviderEnabled(string provider)
            {
            }
            public void OnStatusChanged(string provider, [GeneratedEnum] Availability status, Bundle extras)
            {
            }
        }
        public void OnLocationChanged(Location location)
        {
        }
        public void OnProviderDisabled(string provider)
        {
        }
        public void OnProviderEnabled(string provider)
        {
        }
        public void OnStatusChanged(string provider, [GeneratedEnum] Availability status, Bundle extras)
        {
        }
        #endregion
        public override StartCommandResult OnStartCommand(Intent intent, [GeneratedEnum] StartCommandFlags flags, int startId)
        {
            return StartCommandResult.Sticky;
        }
    }
}
ZigbeeApp/Shared.Droid/Net/NetWiFi.cs
New file
@@ -0,0 +1,188 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Android.App;
using Android.Content;
using Android.OS;
using Android.Runtime;
using Android.Views;
using Android.Widget;
using Android.Net.Wifi;
using System.Net;
using Java.Net;
using Android.Net;
using Android;
namespace Shared.Net
{
    public class NetWiFi
    {
        /// <summary>
        /// 9.0系统以上需要加权限 android.permission.ACCESS_FINE_LOCATION、android.permission.ACCESS_COARSE_LOCATION、android.permission.CHANGE_WIFI_STATE
        /// 8.1系统需要加权限 android.permission.CHANGE_NETWORK_STATE android.permission.CHANGE_WIFI_STATE
        /// æ‰€æœ‰ç³»ç»Ÿç‰ˆæœ¬éƒ½éœ€è¦åŠ  android.permission.ACCESS_NETWORK_STATE、android.permission.ACCESS_WIFI_STATE
        /// </summary>
        /// <param name="action"></param>
        public static void GetWIFISSID(Action<string> action)
        {
            var ssid = "unknown id";
            if ((int)Build.VERSION.SdkInt <= 26/*8.0*/ )
            {
                var mWifiManager = (WifiManager)Shared.Application.Activity.ApplicationContext.GetSystemService(Android.Content.Context.WifiService);
                if (mWifiManager != null)
                {
                    var info = mWifiManager.ConnectionInfo;
                    if (info != null)
                    {
                        ssid=info.SSID.Replace("\"", "");
                    }
                }
                action?.Invoke(ssid);
            }
            //8.1
            else if ((int)Build.VERSION.SdkInt == 27)
            {
                var connManager = (ConnectivityManager)Shared.Application.Activity.ApplicationContext.GetSystemService(Android.Content.Context.ConnectivityService);
                if (connManager != null)
                {
                    var networkInfo = connManager.ActiveNetworkInfo;
                    if (networkInfo.IsConnected)
                    {
                        if (networkInfo.ExtraInfo != null)
                        {
                            ssid = networkInfo.ExtraInfo.Replace("\"", "");
                        }
                    }
                }
                action?.Invoke(ssid);
            }
            else  /*(int)Build.VERSION.SdkInt >= 28  //9.0*/
            {
                (Shared.Application.Activity as BaseActivity).SetPermission((b) =>
                {
                    if (b)
                    {
                        var mWifiManager = (WifiManager)Shared.Application.Activity.ApplicationContext.GetSystemService(Android.Content.Context.WifiService);
                        if (mWifiManager != null)
                        {
                            var info = mWifiManager.ConnectionInfo;
                            ssid = info.SSID.Replace("\"", "");
                        }
                    }
                    action?.Invoke(ssid);
                }, Manifest.Permission.AccessFineLocation);
            }
        }
        public string GetIPAddress()
        {
            string ipAddress = "127.0.0.1";
            try
            {
                var wifimanage = (WifiManager)Application.Activity.BaseContext.GetSystemService(Context.WifiService);//获取WifiManager
                var wifiinfo = wifimanage.ConnectionInfo;
                if (wifiinfo.IpAddress == 0)
                {
                    var networkInterfaces = NetworkInterface.NetworkInterfaces;
                    while (networkInterfaces.HasMoreElements)
                    {
                        var ha = (networkInterfaces.NextElement() as NetworkInterface).InetAddresses;
                        while (ha.HasMoreElements)
                        {
                            var t = (ha.NextElement() as InetAddress);
                            if (!t.IsLoopbackAddress && t.GetType() == typeof(Inet4Address))
                            {
                                return t.HostAddress;
                            }
                        }
                    }
                }
                else
                {
                    ipAddress = intToIp(wifiinfo.IpAddress);
                }
            }catch(Exception e){
            }
            return ipAddress;
            //return MyJar.Common.GetIpAddress(Shared.Application.Activity);
        }
        string intToIp(int i)
        {
            return (i & 0xFF) + "." + ((i >> 8) & 0xFF) + "." + ((i >> 16) & 0xFF) + "." + ((i >> 24) & 0xFF);
        }
        /// <summary>
        /// å½“前IP地址
        /// </summary>
        public System.Net.IPAddress IpAddress
        {
            get
            {
                return System.Net.IPAddress.Parse(GetIPAddress());
            }
        }
        /// <summary>
        /// å¹¿æ’­åœ°å€
        /// </summary>
        public System.Net.IPAddress BroadcastIpAddress
        {
            get
            {
                return System.Net.IPAddress.Parse(getBroadcastAddress());
            }
        }
        string  getBroadcastAddress()
        {
            //var networkInfo = ((ConnectivityManager)Android.App.Application.Context.GetSystemService(Context.ConnectivityService)).ActiveNetworkInfo;
            //if (networkInfo != null && networkInfo.IsConnected)
            //{
            //    if (networkInfo.Type == ConnectivityType.Wifi)
            //    {
            //    }
            //}
            var broadcastAddress = "0.0.0.0";
            var eni = NetworkInterface.NetworkInterfaces;
            while (eni.HasMoreElements)
            {
                var networkCard = (NetworkInterface)eni.NextElement();
                if(!(networkCard.Name=="wlan0"||networkCard.Name=="eth0")){
                    continue;
                }
                var ncAddrList = networkCard.InterfaceAddresses;
                foreach (var networkCardAddress in ncAddrList)
                {
                    var address = networkCardAddress.Address;
                    if (!address.IsLoopbackAddress)
                    {
                        if (address.HostAddress.IndexOf(":") > 0)
                        {
                            // case : ipv6
                            continue;
                        }
                        else
                        {
                            // case : ipv4
                            broadcastAddress = networkCardAddress.Broadcast.HostAddress;
                            break;
                        }
                    }
                }
            }
            return broadcastAddress;
        }
    }
}
ZigbeeApp/Shared.Droid/Net/WifiUtil.cs
New file
@@ -0,0 +1,107 @@
using System;
using Android.Content;
using Android.Net.Wifi;
namespace Shared.Net
{
    public class WifiUtil
    {
        /*
        * åˆ‡æ¢åˆ°æŒ‡å®šwifi
        * @param wifiName  æŒ‡å®šçš„wifi名字
        * @param wifiPwd   wifi密码,如果已经保存过密码,可以传入null
        * @return
        */
        public void ConnectToWifi (Action<bool> action, string wifiName, string wifiPwd = null)
        {
            bool result = false;
            try {
                string tempWifiName = "\"" + wifiName + "\"";
                // å¦‚æžœwifi权限没打开(1、先打开wifi,2,使用指定的wifi
                if (!mWifiManager.IsWifiEnabled) {
                    if (!mWifiManager.SetWifiEnabled (true)) {
                        return;
                    }
                }
                var wifiList = mWifiManager.ConfiguredNetworks;
                var bFindInList = false;
                for (int i = 0; i < wifiList.Count; i++) {
                    var wifiInfo0 = wifiList [i];
                    // å…ˆæ‰¾åˆ°å¯¹åº”çš„wifi
                    if (tempWifiName == (wifiInfo0.Ssid) || wifiName == (wifiInfo0.Ssid)) {
                        bFindInList = true;
                        // 1、 å…ˆå¯åŠ¨ï¼Œå¯èƒ½å·²ç»è¾“å…¥è¿‡å¯†ç ï¼Œå¯ä»¥ç›´æŽ¥å¯åŠ¨
                        result = doChange2Wifi (wifiInfo0.NetworkId);
                    }
                }
                // 2、如果wifi还没有输入过密码,尝试输入密码,启动wifi
                if (!bFindInList) {
                    var wifiNewConfiguration = createWifiInfo (wifiName, wifiPwd);//使用wpa2的wifi加密方式
                    int newNetworkId = mWifiManager.AddNetwork (wifiNewConfiguration);
                    if (newNetworkId == -1) {
                        //Log.e (TAG, "操作失败,需要您到手机wifi列表中取消对设备连接的保存");
                    } else {
                        result = doChange2Wifi (newNetworkId);
                    }
                }
            } catch { } finally {
                if (action != null)
                    action (result);
            }
        }
        bool doChange2Wifi (int newNetworkId)
        {
            var enableNetwork = mWifiManager.EnableNetwork (newNetworkId, true);
            if (!enableNetwork) {
                //"切换到指定wifi失败";
                return false;
            } else {
                // "切换到指定wifi成功";
                return true;
            }
        }
         /*
         * åˆ›å»º WifiConfiguration,这里创建的是wpa2加密方式的wifi
         * @param ssid     wifi账号
         * @param password wifi密码
         * @return
         */
        WifiConfiguration createWifiInfo (string ssid, string password)
        {
            var config = new WifiConfiguration ();
            config.AllowedAuthAlgorithms.Clear ();
            config.AllowedGroupCiphers.Clear ();
            config.AllowedKeyManagement.Clear ();
            config.AllowedPairwiseCiphers.Clear ();
            config.AllowedProtocols.Clear ();
            config.Ssid = "\"" + ssid + "\"";
            config.PreSharedKey = "\"" + password + "\"";
            config.AllowedAuthAlgorithms.Set ((int)WifiConfiguration.AuthAlgorithm.Open);
            config.AllowedGroupCiphers.Set ((int)WifiConfiguration.GroupCipher.Tkip);
            config.AllowedGroupCiphers.Set ((int)WifiConfiguration.GroupCipher.Ccmp);
            config.AllowedKeyManagement.Set ((int)WifiConfiguration.KeyMgmt.WpaPsk);
            config.AllowedPairwiseCiphers.Set ((int)WifiConfiguration.PairwiseCipher.Tkip);
            config.AllowedPairwiseCiphers.Set ((int)WifiConfiguration.PairwiseCipher.Ccmp);
            config.AllowedProtocols.Set ((int)WifiConfiguration.Protocol.Rsn);
            config.AllowedProtocols.Set ((int)WifiConfiguration.Protocol.Wpa);
            config.StatusField = WifiStatus.Enabled;
            return config;
        }
        WifiManager mWifiManager;
        // å•例
        static WifiUtil ourInstance = new WifiUtil ();
        public static WifiUtil Instance {
            get {
                if (ourInstance.mWifiManager == null) {
                    ourInstance.mWifiManager = (WifiManager)Shared.Application.Activity.GetSystemService (Context.WifiService);
                }
                return ourInstance;
            }
        }
    }
}
ZigbeeApp/Shared.Droid/Other/DensityUtil.cs
New file
@@ -0,0 +1,30 @@
using System;
namespace Shared
{
       internal static class DensityUtil {
        /// <summary>
        /// æ ¹æ®æ‰‹æœºçš„分辨率从 dp çš„单位 è½¬æˆä¸º px(像素)
        /// </summary>
        /// <returns>The px.</returns>
        /// <param name="dpValue">Dp value.</param>
        public static int Dip2Px(float dpValue) {
            float scale = Application.Activity.Resources.DisplayMetrics.Density;
            //            scale = context.Resources.DisplayMetrics.Density;
            return (int) (dpValue * scale + 0.5f);
        }
        /// <summary>
        /// æ ¹æ®æ‰‹æœºçš„分辨率从 px(像素) çš„单位 è½¬æˆä¸º dp
        /// </summary>
        /// <returns>The dip.</returns>
        /// <param name="pxValue">Px value.</param>
        public static int Px2Dip(float pxValue) {
            float scale = Application.Activity.Resources.DisplayMetrics.Density;
            return (int) (pxValue / scale + 0.5f);
        }
    }
}
ZigbeeApp/Shared.Droid/Other/MusicInfo.cs
New file
@@ -0,0 +1,133 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Android.App;
using Android.Content;
using Android.OS;
using Android.Runtime;
using Android.Views;
using Android.Widget;
using Android.Provider;
namespace Shared
{
    [System.Serializable]
    public class MusicInfo
    {
        static MusicInfo ()
        {
            System.Threading.Tasks.Task.Run (() => {
                var cursor = Application.Activity.ContentResolver.Query (MediaStore.Audio.Media.ExternalContentUri, new []
                {
                    MediaStore.Audio.AudioColumns.Id,//歌曲ID
                    MediaStore.Audio.AudioColumns.Title,//歌曲名称
                    MediaStore.Audio.AudioColumns.Artist,//歌曲的歌手名
                    MediaStore.Audio.AudioColumns.Album,// æ­Œæ›²çš„专辑名
                    MediaStore.Audio.AudioColumns.AlbumId,//歌曲专辑ID
                    MediaStore.Audio.AudioColumns.Data,//歌曲文件的路径
                    MediaStore.Audio.AudioColumns.Size,//歌曲的总播放时长
                    MediaStore.Audio.AudioColumns.Duration,//歌曲的总播放时长
                   }, null, null, null);
                for (cursor.MoveToFirst (); !cursor.IsAfterLast; cursor.MoveToNext ()) {
                    musicInfoList.Add (new MusicInfo {
                        SourceType = "Local",
                        ID = cursor.GetString (cursor.GetColumnIndex (MediaStore.Audio.AudioColumns.Id))?.Trim ('<').Trim('>').Replace ("&", ""),
                        Title = cursor.GetString (cursor.GetColumnIndex (MediaStore.Audio.AudioColumns.Title))?.Trim('<').Trim('>').Replace ("&", ""),
                        Artist = cursor.GetString (cursor.GetColumnIndex (MediaStore.Audio.AudioColumns.Artist))?.Trim('<').Trim('>').Replace ("&", ""),
                        Album = cursor.GetString (cursor.GetColumnIndex (MediaStore.Audio.AudioColumns.Album))?.Trim('<').Trim('>').Replace ("&", ""),
                        AlbumId = cursor.GetString (cursor.GetColumnIndex (MediaStore.Audio.AudioColumns.AlbumId))?.Trim('<').Trim('>').Replace ("&", ""),
                        Data = cursor.GetString (cursor.GetColumnIndex (MediaStore.Audio.AudioColumns.Data))?.Replace ("&", ""),
                        Size = cursor.GetString (cursor.GetColumnIndex (MediaStore.Audio.AudioColumns.Size))?.Trim('<').Trim('>').Replace ("&", ""),
                        Duration = cursor.GetString (cursor.GetColumnIndex (MediaStore.Audio.AudioColumns.Duration))?.Trim('<').Trim('>').Replace ("&", ""),
                    });
                    if (500 <= musicInfoList.Count) {
                        break;
                    }
                }
                cursor.Close();
            });
        }
        /// <summary>
        /// æ­Œæ›²åç§°
        /// </summary>
        public string Title;
        /// <summary>
        /// æ­Œæ›²çš„æ­Œæ‰‹å
        /// </summary>
        public string Artist;
        /// <summary>
        /// æ­Œæ›²çš„专辑名
        /// </summary>
        public string Album;
        /// <summary>
        /// æ­Œæ›²ä¸“辑ID
        /// </summary>
        public string AlbumId;
        /// <summary>
        /// æ­Œæ›²æ–‡ä»¶çš„路径
        /// </summary>
        public string Data;
        /// <summary>
        /// æ­Œæ›²çš„æ€»æ’­æ”¾æ—¶é•¿
        /// </summary>
        public string Size;
        /// <summary>
        /// æ­Œæ›²çš„æ€»æ’­æ”¾æ—¶é•¿
        /// </summary>
        public string Duration;
        /// <summary>
        /// éŸ³ä¹ID
        /// </summary>
        public string ID;
        /// <summary>
        /// ç½‘络地址
        /// </summary>
        public string URL;
        /// <summary>
        ///   æ–‡ä»¶å
        /// </summary>
        public string filename;
        /// <summary>
        /// DLNA列表名
        /// </summary>
        public string dlnalistName;
        /// <summary>
        /// å›¾ç‰‡
        /// </summary>
        public string Image;
        /// <summary>
        /// ç”µå°ç±»åž‹
        /// </summary>
        public string Cntype;
        /// <summary>
        /// ç”µå°ç±»åž‹
        /// </summary>
        public string Cnkey;
        /// <summary>
        /// æ˜¯å¦æ˜¯ç›®å½•
        /// </summary>
        public bool IsDirectory = true;
        public string SourceType;
        public string SourceName;
        readonly static List<MusicInfo> musicInfoList = new List<MusicInfo> ();
        /// <summary>
        /// èŽ·å–æ‰€æœ‰çš„
        /// </summary>
        public static List<MusicInfo> MusicInfoList {
            get {
                return musicInfoList;
            }
        }
        public object Tag;
    }
}
ZigbeeApp/Shared.Droid/Other/MusicService.cs
New file
@@ -0,0 +1,111 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Android.App;
using Android.Content;
using Android.OS;
using Android.Runtime;
using Android.Views;
using Android.Widget;
using Android.Net.Wifi;
using com.hdl.on;
namespace Shared.Other
{
    [Service]
    public class MusicService : Service
    {
        /// <summary>
        /// æœ¬åœ°éŸ³ä¹çš„监听服务
        /// </summary>
        private Server server;
        /// <summary>
        /// æ˜¯å¦æ­£åœ¨è¿è¡Œ
        /// </summary>
        private bool isRunning = false;
        public override IBinder OnBind (Intent intent)
        {
            return null;
        }
        public override void OnCreate ()
        {
            base.OnCreate ();
            startServer ();
        }
        public override void OnDestroy ()
        {
            base.OnDestroy ();
            stopServer ();
        }
        /// <summary>
        /// WebServer æœ¬åœ°è·¯å¾„
        /// </summary>
        /// <value>The get document root.</value>
        string documentRoot => Android.OS.Environment.ExternalStorageDirectory.AbsolutePath + "/WebServer/";
        /// <summary>
        /// åˆå§‹åŒ–WebServer的路径
        /// </summary>
        void initDocumentRoot ()
        {
            try {
                if (!(new Java.IO.File (documentRoot)).Exists ()) {
                    new Java.IO.File (documentRoot).Mkdir ();
                    var bout = new Java.IO.BufferedWriter (new Java.IO.FileWriter (documentRoot + "index.html"));
                    bout.Write ("<html><head><title>Android Webserver</title>");
                    bout.Write ("</head>");
                    bout.Write ("<body>Willkommen auf dem Android Webserver.");
                    bout.Write ("<br><br>Die HTML-Dateien liegen in " + documentRoot + ", der Sourcecode dieser App auf ");
                    bout.Write ("<a href=\"https://github.com/bodeme/androidwebserver\">Github</a>");
                    bout.Write ("</body></html>");
                    bout.Flush ();
                    bout.Close ();
                    bout = new Java.IO.BufferedWriter (new Java.IO.FileWriter (documentRoot + "403.html"));
                    bout.Write ("<html><head><title>Error 403</title>");
                    bout.Write ("</head>");
                    bout.Write ("<body>403 - Forbidden</body></html>");
                    bout.Flush ();
                    bout.Close ();
                    bout = new Java.IO.BufferedWriter (new Java.IO.FileWriter (documentRoot + "404.html"));
                    bout.Write ("<html><head><title>Error 404</title>");
                    bout.Write ("</head>");
                    bout.Write ("<body>404 - File not found</body></html>");
                    bout.Flush ();
                    bout.Close ();
                }
            } catch (Exception e) {
                Android.Util.Log.Verbose ("ERROR", e.Message);
            }
        }
        void startServer()
        {
            try {
                if(isRunning){
                    return;
                }
                isRunning = true;
                initDocumentRoot ();
                server = new Server (documentRoot, ApplicationContext);
                server.Start ();
            }
            catch (Exception e)
            {
                isRunning = false;
            }
        }
        void stopServer ()
        {
            try {
                if (null != server) {
                    server.stopServer ();
                    server.Interrupt ();
                    isRunning = false;
                }
            } catch { }
        }
    }
}
ZigbeeApp/Shared.Droid/Other/Server.cs
New file
@@ -0,0 +1,74 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Android.App;
using Android.Content;
using Android.OS;
using Android.Runtime;
using Android.Views;
using Android.Widget;
using Java.Net;
using Shared.Other;
namespace com.hdl.on
{
    public class Server : Java.Lang.Thread
    {
        private ServerSocket listener = null;
        private bool running = true;
        private string documentRoot;
        private Context context;
        public static int Port=22222;
        public static List<Socket> clientList = new List<Socket>();
        public Server(string documentRoot, Context context):base()
        {
            this.documentRoot = documentRoot;
            this.context = context;
            listener = new ServerSocket(Port);
        }
        public override void Run()
        {
            while (running)
            {
                try
                {
                    var client = listener.Accept();
                    new ServerHandler(documentRoot, context, client).Start();
                    clientList.Add(client);
                }
                catch (Exception e)
                {
                    Android.Util.Log.Error("Webserver", e.Message);
                }
            }
        }
        public void stopServer()
        {
            running = false;
            try
            {
                listener.Close();
            }
            catch (Exception e)
            {
                Android.Util.Log.Error("Webserver", e.Message);
            }
        }
        public static void remove(Socket s)
        {
            clientList.Remove(s);
        }
    }
}
ZigbeeApp/Shared.Droid/Other/ServerHandler.cs
New file
@@ -0,0 +1,273 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Android.App;
using Android.Content;
using Android.OS;
using Android.Runtime;
using Android.Views;
using Android.Widget;
using Java.Net;
using Java.IO;
using Java.Util.Regex;
using Android.Database;
using com.hdl.on;
namespace Shared.Other
{
    class ServerHandler : Java.Lang.Thread
    {
        private BufferedReader in1;
        private PrintWriter out1;
        private string documentRoot;
        private Context context;
        private Socket toClient;
        public ServerHandler(string d, Context c, Socket s)
        {
            documentRoot = d;
            context = c;
            toClient = s;
        }
        public override void Run()
        {
            string dokument = "";
            try
            {
                in1 = new BufferedReader(new InputStreamReader(toClient.InputStream));
                // Receive data
                while (true)
                {
                    var s = in1.ReadLine().Trim();
                    if (s == (""))
                    {
                        break;
                    }
                    if (s.Substring(0, 3) == ("GET"))
                    {
                        int leerstelle = s.IndexOf(" HTTP/");
                        dokument = s.Substring(5, leerstelle-5);
                        //dokument = dokument.Replace("[/]+", "/");
                    }
                }
            }
            catch (Exception e)
            {
                Server.remove(toClient);
                try
                {
                    toClient.Close();
                }
                catch (Exception ex) { }
            }
            Java.Util.Regex.Pattern taskerPattern = Java.Util.Regex.Pattern.Compile("tasker/(.+)");
            Matcher taskerMatcher = taskerPattern.Matcher(dokument);
            if (taskerMatcher.Matches())
            {
                try
                {
                    dokument = Java.Net.URLDecoder.Decode(taskerMatcher.Group(1), "UTF-8");
                    sendTasker(dokument);
                }
                catch (UnsupportedEncodingException e)
                {
                    // TODO Auto-generated catch block
                    e.PrintStackTrace();
                    showHtml("403.html");
                }
            }
            else if (dokument == ("tasker/"))
            {
                listTaskerTasks();
            }
            else
            {
                showHtml(dokument);
            }
        }
        private void sendTasker(string taskName)
        {
            ////net.dinglisch.android.tasker.TaskerIntent
            //if (TaskerIntent.testStatus(context)==(TaskerIntent.Status.OK))
            //{
            //    TaskerIntent i = new TaskerIntent(taskName);
            //    context.sendBroadcast(i);
            //    send("Sent intent \"" + taskName + "\" to tasker.");
            //}
            //else
            //{
            //    send("Could not sent intent \"" + taskName + "\" to tasker (" +
            //            TaskerIntent.testStatus(context) + ").");
            //}
        }
        private void listTaskerTasks()
        {
            ICursor c = context.ContentResolver.Query(Android.Net.Uri.Parse("content://net.dinglisch.android.tasker/tasks"), null, null, null, null);
            string text = "Found tasks:<ul>";
            if (c != null)
            {
                Android.Util.Log.Debug("Webserver", "Cursor is not null");
                int nameCol = c.GetColumnIndex("name");
                int projNameCol = c.GetColumnIndex("project_name");
                while (c.MoveToNext())
                {
                    text = text + "<li><a href=\"/tasker/" + c.GetString(nameCol) + "\">" + c.GetString(projNameCol) + ": " + c.GetString(nameCol) + "</a></li>";
                }
                c.Close();
            }
            else
            {
                Android.Util.Log.Debug("Webserver", "Cursor is null");
            }
            text = text + "</ul>";
            send(text);
        }
        private void send(string text)
        {
            string header = getHeaderBase();
            header = header.Replace("%code%", "200 ok");
            header = header.Replace("%length%", "" + text.Length);
            try
            {
                out1 = new PrintWriter(toClient.OutputStream, true);
                out1.Print(header);
                out1.Print(text);
                out1.Flush();
                Server.remove(toClient);
                toClient.Close();
            }
            catch (Exception e)
            {
            }
        }
        private void showHtml(string dokument)
        {
            for (int i = 0; i < Shared.MusicInfo.MusicInfoList.Count; i++)
            {
                var m = Shared.MusicInfo.MusicInfoList[i];
                if ((m.ID + "")==(dokument))
                {
                    dokument = m.Data;
                    break;
                }
            }
            //Standard-Doc
            if (dokument == (""))
            {
                dokument = "index.html";
            }
            // Don't allow directory traversal
            if (dokument.IndexOf("..") != -1)
            {
                dokument = "403.html";
            }
            // Search for files in docroot
            //dokument = documentRoot + dokument;
            Android.Util.Log.Debug("Webserver", "Got " + dokument);
            dokument = dokument.Replace("/+", "/");
            if (dokument.Substring(dokument.Length - 1) == "/")
            {
                dokument = documentRoot + "404.html";
            }
            string header = getHeaderBase();
            header = header.Replace("%code%", "403 Forbidden");
            try
            {
                File f = new File(dokument);
                if (!f.Exists())
                {
                    header = getHeaderBase();
                    header = header.Replace("%code%", "404 File not found");
                    dokument = "404.html";
                }
            }
            catch (Exception e) { }
            if (!(dokument == (documentRoot + "403.html")))
            {
                header = getHeaderBase().Replace("%code%", "200 OK");
            }
            Android.Util.Log.Debug("Webserver", "Serving " + dokument);
            try
            {
                File f = new File(dokument);
                if (f.Exists())
                {
                    BufferedInputStream in1 = new BufferedInputStream(new System.IO.FileStream(dokument,System.IO.FileMode.Open,System.IO.FileAccess.Read));
                    BufferedOutputStream out1 = new BufferedOutputStream(toClient.OutputStream);
                    ByteArrayOutputStream tempOut = new ByteArrayOutputStream();
                    byte[] buf = new byte[4096];
                    int count = 0;
                    while ((count = in1.Read(buf)) != -1) {
                        tempOut.Write(buf, 0, count);
                    }
                    tempOut.Flush();
                    header = header.Replace("%length%", "" + tempOut.Size());
                    out1.Write(System.Text.Encoding.UTF8.GetBytes(header));
                    out1.Write(tempOut.ToByteArray());
                    out1.Flush();
                }
                else
                {
                    // Send HTML-File (Ascii, not as a stream)
                    header = getHeaderBase();
                    header = header.Replace("%code%", "404 File not found");
                    header = header.Replace("%length%", "" + "404 - File not Found".Length);
                    out1 = new PrintWriter(toClient.OutputStream, true);
                    out1.Print(header);
                    out1.Print("404 - File not Found");
                    out1.Flush();
                }
                Server.remove(toClient);
                toClient.Close();
            }
            catch (Exception e)
            {
            }
        }
        private string getHeaderBase()
        {
            return "HTTP/1.1 %code%\n" +
              "Server: AndroidWebserver/1.0\n" +
              "Content-Length: %length%\n" +
              "Connection: close\n" +
              "Content-Type: text/html; charset=iso-8859-1\n\n";
        }
    }
}
ZigbeeApp/Shared.Droid/Other/Volume.cs
New file
@@ -0,0 +1,40 @@
using System;
using Android.Content;
using Android.Media;
namespace com.hdl.on
{
    public static class Volume
    {
        /// <summary>
        /// éŸ³é‡å˜åŒ–事件
        /// </summary>
        public static Action<int> VolumeChange;
        /// <summary>
        /// æ˜¯å¦éœ€è¦æ›´æ–°å½“前音量
        /// </summary>
        static bool isNeedUpdate = true;
        /// <summary>
        /// è®¾ç½®å½“前音量
        /// </summary>
        /// <param name="volume">Volume.</param>
        public static int MusicVolume {
            set {
                if (!isNeedUpdate) {
                    return;
                }
                isNeedUpdate = false;
                AudioManager audioManager = (AudioManager)Shared.Application.Activity.GetSystemService (Context.AudioService);
                float tempVolume = value / 100.0f * audioManager.GetStreamMaxVolume (Stream.Music);
                audioManager.SetStreamVolume (Stream.Music, (int)tempVolume, 0);
            }
        }
        /// <summary>
        /// åˆå§‹åŒ–当前音量播放类型是媒体
        /// </summary>
        public static void Init ()
        {
            Shared.Application.Activity.VolumeControlStream = Stream.Music;
        }
    }
}
ZigbeeApp/Shared.Droid/Properties/AssemblyInfo.cs
New file
@@ -0,0 +1,28 @@
using System.Reflection;
using System.Runtime.CompilerServices;
using Android.App;
// Information about this assembly is defined by the following attributes.
// Change them to the values specific to your project.
[assembly: AssemblyTitle("Shared.Droid")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("")]
[assembly: AssemblyCopyright("hdl")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
// The assembly version has the format "{Major}.{Minor}.{Build}.{Revision}".
// The form "{Major}.{Minor}.*" will automatically update the build and revision,
// and "{Major}.{Minor}.{Build}.*" will update just the revision.
[assembly: AssemblyVersion("1.0.2.0")]
// The following attributes are used to specify the signing key for the assembly,
// if desired. See the Mono documentation for more information about signing.
//[assembly: AssemblyDelaySign(false)]
//[assembly: AssemblyKeyFile("")]
ZigbeeApp/Shared.Droid/Shared.Droid.csproj
New file
@@ -0,0 +1,218 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <Import Project="..\..\packages\Xamarin.Build.Download.0.4.3\build\Xamarin.Build.Download.props" Condition="Exists('..\..\packages\Xamarin.Build.Download.0.4.3\build\Xamarin.Build.Download.props')" />
  <PropertyGroup>
    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
    <ProjectGuid>{B7B2BB29-2DF1-4235-A67B-E09C2EC1EBAF}</ProjectGuid>
    <ProjectTypeGuids>{10368E6C-D01B-4462-8E8B-01FC667A7035};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
    <OutputType>Library</OutputType>
    <RootNamespace>Shared.Droid</RootNamespace>
    <AssemblyName>Shared.Droid</AssemblyName>
    <TargetFrameworkVersion>v8.0</TargetFrameworkVersion>
    <MonoAndroidResourcePrefix>Resources</MonoAndroidResourcePrefix>
    <MonoAndroidAssetsPrefix>Assets</MonoAndroidAssetsPrefix>
    <ReleaseVersion>1.0.0.1</ReleaseVersion>
    <SynchReleaseVersion>false</SynchReleaseVersion>
    <AndroidTlsProvider></AndroidTlsProvider>
  </PropertyGroup>
  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
    <DebugSymbols>true</DebugSymbols>
    <DebugType>full</DebugType>
    <Optimize>false</Optimize>
    <OutputPath>bin\Debug</OutputPath>
    <DefineConstants>DEBUG;</DefineConstants>
    <ErrorReport>prompt</ErrorReport>
    <WarningLevel>4</WarningLevel>
    <DocumentationFile>bin\Debug\Shared.Droid.xml</DocumentationFile>
    <ConsolePause>false</ConsolePause>
    <AndroidLinkMode>None</AndroidLinkMode>
    <AllowUnsafeBlocks>false</AllowUnsafeBlocks>
  </PropertyGroup>
  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
    <Optimize>true</Optimize>
    <OutputPath>bin\Release</OutputPath>
    <ErrorReport>prompt</ErrorReport>
    <WarningLevel>4</WarningLevel>
    <DocumentationFile>bin\Release\Shared.Droid.xml</DocumentationFile>
    <ConsolePause>false</ConsolePause>
    <AndroidUseSharedRuntime>false</AndroidUseSharedRuntime>
    <AllowUnsafeBlocks>false</AllowUnsafeBlocks>
  </PropertyGroup>
  <ItemGroup>
    <Reference Include="System" />
    <Reference Include="System.Xml" />
    <Reference Include="System.Core" />
    <Reference Include="Mono.Android" />
    <Reference Include="System.Data" />
    <Reference Include="System.Web.Services" />
    <Reference Include="Shared.Droid.HDLWidget">
      <HintPath>..\Shared\DLL\Android\Shared.Droid.HDLWidget.dll</HintPath>
    </Reference>
    <Reference Include="Shared.Droid.Smartrefresh">
      <HintPath>..\Shared\DLL\Android\Shared.Droid.Smartrefresh.dll</HintPath>
    </Reference>
    <Reference Include="Shared.Droid.TouchID">
      <HintPath>..\Shared\DLL\Android\Shared.Droid.TouchID.dll</HintPath>
    </Reference>
    <Reference Include="Xamarin.Android.Arch.Core.Common">
      <HintPath>..\Shared\DLL\Android\Xamarin.Android.Arch.Core.Common.dll</HintPath>
    </Reference>
    <Reference Include="Xamarin.Android.Arch.Lifecycle.Common">
      <HintPath>..\Shared\DLL\Android\Xamarin.Android.Arch.Lifecycle.Common.dll</HintPath>
    </Reference>
    <Reference Include="Xamarin.Android.Arch.Lifecycle.Runtime">
      <HintPath>..\Shared\DLL\Android\Xamarin.Android.Arch.Lifecycle.Runtime.dll</HintPath>
    </Reference>
    <Reference Include="Xamarin.Android.Support.Animated.Vector.Drawable">
      <HintPath>..\Shared\DLL\Android\Xamarin.Android.Support.Animated.Vector.Drawable.dll</HintPath>
    </Reference>
    <Reference Include="Xamarin.Android.Support.Annotations">
      <HintPath>..\Shared\DLL\Android\Xamarin.Android.Support.Annotations.dll</HintPath>
    </Reference>
    <Reference Include="Xamarin.Android.Support.Compat">
      <HintPath>..\Shared\DLL\Android\Xamarin.Android.Support.Compat.dll</HintPath>
    </Reference>
    <Reference Include="Xamarin.Android.Support.Core.UI">
      <HintPath>..\Shared\DLL\Android\Xamarin.Android.Support.Core.UI.dll</HintPath>
    </Reference>
    <Reference Include="Xamarin.Android.Support.Core.Utils">
      <HintPath>..\Shared\DLL\Android\Xamarin.Android.Support.Core.Utils.dll</HintPath>
    </Reference>
    <Reference Include="Xamarin.Android.Support.Fragment">
      <HintPath>..\Shared\DLL\Android\Xamarin.Android.Support.Fragment.dll</HintPath>
    </Reference>
    <Reference Include="Xamarin.Android.Support.Media.Compat">
      <HintPath>..\Shared\DLL\Android\Xamarin.Android.Support.Media.Compat.dll</HintPath>
    </Reference>
    <Reference Include="Xamarin.Android.Support.v4">
      <HintPath>..\Shared\DLL\Android\Xamarin.Android.Support.v4.dll</HintPath>
    </Reference>
    <Reference Include="Xamarin.Android.Support.v7.AppCompat">
      <HintPath>..\Shared\DLL\Android\Xamarin.Android.Support.v7.AppCompat.dll</HintPath>
    </Reference>
    <Reference Include="Xamarin.Android.Support.Vector.Drawable">
      <HintPath>..\Shared\DLL\Android\Xamarin.Android.Support.Vector.Drawable.dll</HintPath>
    </Reference>
    <Reference Include="Xamarin.Android.Support.v7.RecyclerView">
      <HintPath>..\Shared\DLL\Android\Xamarin.Android.Support.v7.RecyclerView.dll</HintPath>
    </Reference>
    <Reference Include="Newtonsoft.Json">
      <HintPath>..\Shared\DLL\Newtonsoft.Json.dll</HintPath>
    </Reference>
  </ItemGroup>
  <ItemGroup>
    <Compile Include="Properties\AssemblyInfo.cs" />
    <Compile Include="IO\FileUtils.cs" />
    <Compile Include="Net\NetWiFi.cs" />
    <Compile Include="Other\DensityUtil.cs" />
    <Compile Include="UI\Alert.cs" />
    <Compile Include="UI\Application.cs" />
    <Compile Include="UI\Button.cs" />
    <Compile Include="UI\DateView.cs" />
    <Compile Include="UI\TimeView.cs" />
    <Compile Include="UI\Dialog.cs" />
    <Compile Include="UI\EditText.cs" />
    <Compile Include="UI\Enum.cs" />
    <Compile Include="UI\HorizontalScrolViewLayout.cs" />
    <Compile Include="UI\HorizontalSeekBar.cs" />
    <Compile Include="UI\Lanuage.cs" />
    <Compile Include="UI\Loading.cs" />
    <Compile Include="UI\PageLayout.cs" />
    <Compile Include="UI\RowLayout.cs" />
    <Compile Include="UI\Spinner.cs" />
    <Compile Include="UI\VerticalScrolViewLayout.cs" />
    <Compile Include="UI\VerticalSeekBar.cs" />
    <Compile Include="UI\Video.cs" />
    <Compile Include="UI\View.cs" />
    <Compile Include="UI\Tip.cs" />
    <Compile Include="UI\FrameLayout.cs" />
    <Compile Include="UI\ViewGroup.cs" />
    <Compile Include="UI\Camera.cs" />
    <Compile Include="UI\TextView.cs" />
    <Compile Include="UI\ColorPicker.cs" />
    <Compile Include="UI\UrlMonitor.cs" />
    <Compile Include="UI\MusicVerticalScrolViewLayout.cs" />
    <Compile Include="UI\SwipeLayout.cs" />
    <Compile Include="UI\ImageView.cs" />
    <Compile Include="UI\WiimuUPnp.cs" />
    <Compile Include="BaseActivity.cs" />
    <Compile Include="Other\Server.cs" />
    <Compile Include="Other\ServerHandler.cs" />
    <Compile Include="Other\MusicService.cs" />
    <Compile Include="Other\MusicInfo.cs" />
    <Compile Include="Other\Volume.cs" />
    <Compile Include="CommonClass.cs" />
    <Compile Include="MyBroadcastReceive.cs" />
    <Compile Include="Net\WifiUtil.cs" />
    <Compile Include="SplashActivity.cs" />
    <Compile Include="UI\MyEchartsView.cs" />
    <Compile Include="UI\PickerView.cs" />
    <Compile Include="UI\ArcSeekBar.cs" />
    <Compile Include="Utils\TouchIDUtils.cs" />
    <Compile Include="UI\WaveSeekBar.cs" />
    <Compile Include="UI\GDMapView.cs" />
    <Compile Include="Utils\HDLUtils.cs" />
    <Compile Include="UI\UIPickerView.cs" />
    <Compile Include="UI\UICoverFlowView.cs" />
    <Compile Include="UI\CropImage.cs" />
    <Compile Include="UI\UIDrawerLayout.cs" />
    <Compile Include="MyService.cs" />
    <Compile Include="UI\GestureLockView.cs" />
    <Compile Include="UI\QRCode.cs" />
    <Compile Include="UI\Contacts.cs" />
    <Compile Include="UI\VerticalRefreshLayout.cs" />
    <Compile Include="UI\CurtainSeekBar.cs" />
    <Compile Include="UI\CurtainRollSeekBar.cs" />
    <Compile Include="UI\ArcScaleSeekBar.cs" />
    <Compile Include="UI\EditTextView.cs" />
    <Compile Include="UI\HorizontalPages.cs" />
  </ItemGroup>
  <ItemGroup>
    <None Include="Additions\AboutAdditions.txt" />
    <None Include="Jars\AboutJars.txt" />
  </ItemGroup>
  <ItemGroup>
    <TransformFile Include="Transforms\EnumFields.xml" />
    <TransformFile Include="Transforms\EnumMethods.xml" />
    <TransformFile Include="Transforms\Metadata.xml" />
  </ItemGroup>
  <ItemGroup>
    <EmbeddedJar Include="Jars\EzvizGlobalAPI.jar" />
    <EmbeddedJar Include="Jars\MyJar.jar" />
    <EmbeddedJar Include="Jars\libammsdk.jar" />
  </ItemGroup>
  <Import Project="$(MSBuildExtensionsPath)\Xamarin\Android\Xamarin.Android.Bindings.targets" />
  <Import Project="..\..\packages\Xamarin.Build.Download.0.4.3\build\Xamarin.Build.Download.targets" Condition="Exists('..\..\packages\Xamarin.Build.Download.0.4.3\build\Xamarin.Build.Download.targets')" />
  <Import Project="..\..\packages\Xamarin.Android.Support.Annotations.25.3.1\build\MonoAndroid70\Xamarin.Android.Support.Annotations.targets" Condition="Exists('..\..\packages\Xamarin.Android.Support.Annotations.25.3.1\build\MonoAndroid70\Xamarin.Android.Support.Annotations.targets')" />
  <Import Project="..\..\packages\Xamarin.Android.Support.Compat.25.3.1\build\MonoAndroid70\Xamarin.Android.Support.Compat.targets" Condition="Exists('..\..\packages\Xamarin.Android.Support.Compat.25.3.1\build\MonoAndroid70\Xamarin.Android.Support.Compat.targets')" />
  <Import Project="..\..\packages\Xamarin.Android.Support.Core.UI.25.3.1\build\MonoAndroid70\Xamarin.Android.Support.Core.UI.targets" Condition="Exists('..\..\packages\Xamarin.Android.Support.Core.UI.25.3.1\build\MonoAndroid70\Xamarin.Android.Support.Core.UI.targets')" />
  <Import Project="..\..\packages\Xamarin.Android.Support.Core.Utils.25.3.1\build\MonoAndroid70\Xamarin.Android.Support.Core.Utils.targets" Condition="Exists('..\..\packages\Xamarin.Android.Support.Core.Utils.25.3.1\build\MonoAndroid70\Xamarin.Android.Support.Core.Utils.targets')" />
  <Import Project="..\..\packages\Xamarin.Android.Support.Media.Compat.25.3.1\build\MonoAndroid70\Xamarin.Android.Support.Media.Compat.targets" Condition="Exists('..\..\packages\Xamarin.Android.Support.Media.Compat.25.3.1\build\MonoAndroid70\Xamarin.Android.Support.Media.Compat.targets')" />
  <Import Project="..\..\packages\Xamarin.Android.Support.Fragment.25.3.1\build\MonoAndroid70\Xamarin.Android.Support.Fragment.targets" Condition="Exists('..\..\packages\Xamarin.Android.Support.Fragment.25.3.1\build\MonoAndroid70\Xamarin.Android.Support.Fragment.targets')" />
  <Import Project="..\..\packages\Xamarin.Android.Support.v4.25.3.1\build\MonoAndroid70\Xamarin.Android.Support.v4.targets" Condition="Exists('..\..\packages\Xamarin.Android.Support.v4.25.3.1\build\MonoAndroid70\Xamarin.Android.Support.v4.targets')" />
  <Import Project="..\..\Demo\Shared\packages\Xamarin.Android.Support.Annotations.26.0.2\build\MonoAndroid80\Xamarin.Android.Support.Annotations.targets" Condition="Exists('..\..\Demo\Shared\packages\Xamarin.Android.Support.Annotations.26.0.2\build\MonoAndroid80\Xamarin.Android.Support.Annotations.targets')" />
  <Import Project="..\..\Demo\Shared\packages\Xamarin.Android.Support.Compat.26.0.2\build\MonoAndroid80\Xamarin.Android.Support.Compat.targets" Condition="Exists('..\..\Demo\Shared\packages\Xamarin.Android.Support.Compat.26.0.2\build\MonoAndroid80\Xamarin.Android.Support.Compat.targets')" />
  <Import Project="..\..\Demo\Shared\packages\Xamarin.Android.Support.Core.UI.26.0.2\build\MonoAndroid80\Xamarin.Android.Support.Core.UI.targets" Condition="Exists('..\..\Demo\Shared\packages\Xamarin.Android.Support.Core.UI.26.0.2\build\MonoAndroid80\Xamarin.Android.Support.Core.UI.targets')" />
  <Import Project="..\..\Demo\Shared\packages\Xamarin.Android.Support.Core.Utils.26.0.2\build\MonoAndroid80\Xamarin.Android.Support.Core.Utils.targets" Condition="Exists('..\..\Demo\Shared\packages\Xamarin.Android.Support.Core.Utils.26.0.2\build\MonoAndroid80\Xamarin.Android.Support.Core.Utils.targets')" />
  <Import Project="..\..\Demo\Shared\packages\Xamarin.Android.Support.Media.Compat.26.0.2\build\MonoAndroid80\Xamarin.Android.Support.Media.Compat.targets" Condition="Exists('..\..\Demo\Shared\packages\Xamarin.Android.Support.Media.Compat.26.0.2\build\MonoAndroid80\Xamarin.Android.Support.Media.Compat.targets')" />
  <Import Project="..\..\Demo\Shared\packages\Xamarin.Android.Support.Fragment.26.0.2\build\MonoAndroid80\Xamarin.Android.Support.Fragment.targets" Condition="Exists('..\..\Demo\Shared\packages\Xamarin.Android.Support.Fragment.26.0.2\build\MonoAndroid80\Xamarin.Android.Support.Fragment.targets')" />
  <Import Project="..\..\Demo\Shared\packages\Xamarin.Android.Support.v4.26.0.2\build\MonoAndroid80\Xamarin.Android.Support.v4.targets" Condition="Exists('..\..\Demo\Shared\packages\Xamarin.Android.Support.v4.26.0.2\build\MonoAndroid80\Xamarin.Android.Support.v4.targets')" />
  <Import Project="..\..\packages\Xamarin.Android.Support.Annotations.28.0.0.3\build\monoandroid80\Xamarin.Android.Support.Annotations.targets" Condition="Exists('..\..\packages\Xamarin.Android.Support.Annotations.28.0.0.3\build\monoandroid80\Xamarin.Android.Support.Annotations.targets')" />
  <Import Project="..\..\packages\Xamarin.Android.Arch.Core.Common.1.1.1.3\build\monoandroid80\Xamarin.Android.Arch.Core.Common.targets" Condition="Exists('..\..\packages\Xamarin.Android.Arch.Core.Common.1.1.1.3\build\monoandroid80\Xamarin.Android.Arch.Core.Common.targets')" />
  <Import Project="..\..\packages\Xamarin.Android.Arch.Lifecycle.Common.1.1.1.3\build\monoandroid80\Xamarin.Android.Arch.Lifecycle.Common.targets" Condition="Exists('..\..\packages\Xamarin.Android.Arch.Lifecycle.Common.1.1.1.3\build\monoandroid80\Xamarin.Android.Arch.Lifecycle.Common.targets')" />
  <Import Project="..\..\packages\Xamarin.Android.Arch.Lifecycle.Runtime.1.1.1.3\build\monoandroid80\Xamarin.Android.Arch.Lifecycle.Runtime.targets" Condition="Exists('..\..\packages\Xamarin.Android.Arch.Lifecycle.Runtime.1.1.1.3\build\monoandroid80\Xamarin.Android.Arch.Lifecycle.Runtime.targets')" />
  <Import Project="..\..\packages\Xamarin.Android.Support.Compat.28.0.0.3\build\monoandroid80\Xamarin.Android.Support.Compat.targets" Condition="Exists('..\..\packages\Xamarin.Android.Support.Compat.28.0.0.3\build\monoandroid80\Xamarin.Android.Support.Compat.targets')" />
  <Import Project="..\..\packages\Xamarin.Android.Support.Core.UI.28.0.0.3\build\monoandroid80\Xamarin.Android.Support.Core.UI.targets" Condition="Exists('..\..\packages\Xamarin.Android.Support.Core.UI.28.0.0.3\build\monoandroid80\Xamarin.Android.Support.Core.UI.targets')" />
  <Import Project="..\..\packages\Xamarin.Android.Support.Core.Utils.28.0.0.3\build\monoandroid80\Xamarin.Android.Support.Core.Utils.targets" Condition="Exists('..\..\packages\Xamarin.Android.Support.Core.Utils.28.0.0.3\build\monoandroid80\Xamarin.Android.Support.Core.Utils.targets')" />
  <Import Project="..\..\packages\Xamarin.Android.Support.Fragment.28.0.0.3\build\monoandroid80\Xamarin.Android.Support.Fragment.targets" Condition="Exists('..\..\packages\Xamarin.Android.Support.Fragment.28.0.0.3\build\monoandroid80\Xamarin.Android.Support.Fragment.targets')" />
  <Import Project="..\..\packages\Xamarin.Android.Support.Media.Compat.28.0.0.3\build\monoandroid80\Xamarin.Android.Support.Media.Compat.targets" Condition="Exists('..\..\packages\Xamarin.Android.Support.Media.Compat.28.0.0.3\build\monoandroid80\Xamarin.Android.Support.Media.Compat.targets')" />
  <Import Project="..\..\packages\Xamarin.Android.Support.Vector.Drawable.28.0.0.3\build\monoandroid80\Xamarin.Android.Support.Vector.Drawable.targets" Condition="Exists('..\..\packages\Xamarin.Android.Support.Vector.Drawable.28.0.0.3\build\monoandroid80\Xamarin.Android.Support.Vector.Drawable.targets')" />
  <Import Project="..\..\packages\Xamarin.Android.Support.Animated.Vector.Drawable.28.0.0.3\build\monoandroid80\Xamarin.Android.Support.Animated.Vector.Drawable.targets" Condition="Exists('..\..\packages\Xamarin.Android.Support.Animated.Vector.Drawable.28.0.0.3\build\monoandroid80\Xamarin.Android.Support.Animated.Vector.Drawable.targets')" />
  <Import Project="..\..\packages\Xamarin.Android.Support.v7.AppCompat.28.0.0.3\build\monoandroid80\Xamarin.Android.Support.v7.AppCompat.targets" Condition="Exists('..\..\packages\Xamarin.Android.Support.v7.AppCompat.28.0.0.3\build\monoandroid80\Xamarin.Android.Support.v7.AppCompat.targets')" />
  <Import Project="..\..\Demo\Shared\packages\Xamarin.Android.Support.v4.28.0.0.3\build\monoandroid80\Xamarin.Android.Support.v4.targets" Condition="Exists('..\..\Demo\Shared\packages\Xamarin.Android.Support.v4.28.0.0.3\build\monoandroid80\Xamarin.Android.Support.v4.targets')" />
</Project>
ZigbeeApp/Shared.Droid/Shared.Droid.sln
New file
@@ -0,0 +1,17 @@
Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 15
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Shared.Droid", "Shared.Droid.csproj", "{B7B2BB29-2DF1-4235-A67B-E09C2EC1EBAF}"
EndProject
Global
    GlobalSection(SolutionConfigurationPlatforms) = preSolution
        Debug|Any CPU = Debug|Any CPU
        Release|Any CPU = Release|Any CPU
    EndGlobalSection
    GlobalSection(ProjectConfigurationPlatforms) = postSolution
        {B7B2BB29-2DF1-4235-A67B-E09C2EC1EBAF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
        {B7B2BB29-2DF1-4235-A67B-E09C2EC1EBAF}.Debug|Any CPU.Build.0 = Debug|Any CPU
        {B7B2BB29-2DF1-4235-A67B-E09C2EC1EBAF}.Release|Any CPU.ActiveCfg = Release|Any CPU
        {B7B2BB29-2DF1-4235-A67B-E09C2EC1EBAF}.Release|Any CPU.Build.0 = Release|Any CPU
    EndGlobalSection
EndGlobal
ZigbeeApp/Shared.Droid/SplashActivity.cs
New file
@@ -0,0 +1,34 @@
using System;
using System.Collections.Generic;
using Android.Animation;
using Android.App;
using Android.Content;
using Android.Graphics;
using Android.Graphics.Drawables;
using Android.OS;
using Android.Runtime;
using Android.Views;
using Android.Views.Animations;
using Java.Lang;
namespace Shared.Droid
{
    //[Activity (MainLauncher = false)]
    public class SplashActivity : Android.App.Activity
    {
        protected override void OnCreate(Bundle savedInstanceState)
        {
            base.OnCreate(savedInstanceState);
            //new Handler ().PostDelayed (() => {
            //    var mainIntent = new Android.Content.Intent(this,typeof())
            //    //SplashActivity.this. (mainIntent);
            //    //SplashActivity.this.Finish ();
            //}, 100);
            //var contentView= new MyJar.LoadingView (this, 2130837756, 2130837756, 2130837756);
            //contentView.SetLoadingRenderer (new MyJar.ElectricFanLoadingRenderer (this, 2130837756, 2130837756, 2130837756));
            //SetContentView (contentView);
        }
    }
}
ZigbeeApp/Shared.Droid/Transforms/EnumFields.xml
New file
@@ -0,0 +1,19 @@
<?xml version="1.0" encoding="UTF-8"?>
<enum-field-mappings>
    <!--
  This example converts the constants Fragment_id, Fragment_name,
  and Fragment_tag from android.support.v4.app.FragmentActivity.FragmentTag
  to an enum called Android.Support.V4.App.FragmentTagType with values
  Id, Name, and Tag.
  <mapping clr-enum-type="Android.Support.V4.App.FragmentTagType" jni-class="android/support/v4/app/FragmentActivity$FragmentTag">
    <field clr-name="Id" jni-name="Fragment_id" value="1" />
    <field clr-name="Name" jni-name="Fragment_name" value="0" />
    <field clr-name="Tag" jni-name="Fragment_tag" value="2" />
  </type>
  Notes:
  - An optional "bitfield" attribute marks the enum type with [Flags].
  - For Java interfaces, use "jni-interface" attribute instead of "jni-class" attribute.
  -->
</enum-field-mappings>
ZigbeeApp/Shared.Droid/Transforms/EnumMethods.xml
New file
@@ -0,0 +1,19 @@
<?xml version="1.0" encoding="UTF-8"?>
<enum-method-mappings>
    <!--
  This example changes the Java method:
    android.support.v4.app.Fragment.SavedState.writeToParcel (int flags)
  to be:
    android.support.v4.app.Fragment.SavedState.writeToParcel (Android.OS.ParcelableWriteFlags flags)
  when bound in C#.
  <mapping jni-class="android/support/v4/app/Fragment.SavedState">
    <method jni-name="writeToParcel" parameter="flags" clr-enum-type="Android.OS.ParcelableWriteFlags" />
  </mapping>
  Notes:
  - For Java interfaces, use "jni-interface" attribute instead of "jni-class" attribute.
  - To change the type of the return value, use "return" as the parameter name.
  - The parameter names will be p0, p1, ... unless you provide JavaDoc file in the project.
  -->
</enum-method-mappings>
ZigbeeApp/Shared.Droid/Transforms/Metadata.xml
New file
@@ -0,0 +1,13 @@
<?xml version="1.0" encoding="UTF-8"?>
<metadata>
   <attr path="/api/package[@name='com.github.abel533.echarts.series']/class[@name='Gauge']" name="name">GaugeRe</attr>
   <attr path="/api/package[@name='com.github.abel533.echarts']/class[@name='Option']" name="name">OptionRe</attr>
   <attr path="/api/package[@name='com.github.abel533.echarts.series']/class[@name='Force']" name="name">ForceRe</attr>
   <attr path="/api/package[@name='com.github.abel533.echarts']/interface[@name='Data']" name="name">DataRe</attr>
 <attr path="/api/package[@name='com.tencent.mm.sdk.openapi']/class[@name='WXMediaMessage']/field[@name='mediaObject']" name="name">NewMediaObject</attr>
  <attr path="/api/package[@name='com.tencent.mm.sdk.openapi']/interface[@name='BaseResp.ErrCode']" name="name">BaseResp.InnerErrCode</attr>
 <remove-node path="/api/package[@name='com.tencent.mm.sdk.plugin']/class[@name='MMPluginProviderConstants.OAuth']"/>
 <remove-node path="/api/package[@name='com.tencent.mm.sdk.plugin']/class[@name='MMPluginProviderConstants.PluginDB']"/>
 <remove-node path="/api/package[@name='com.tencent.mm.sdk.plugin']/class[@name='MMPluginProviderConstants.SharedPref']"/>
</metadata>
ZigbeeApp/Shared.Droid/UI/Alert.cs
New file
@@ -0,0 +1,97 @@
using System;
using Android;
using Android.App;
using Android.Content;
using Android.Views;
namespace Shared
{
    /// <summary>
    /// å¯¹è¯æ¡†
    /// </summary>
    /// 2019--18 ä¿®æ”¹
    public class Alert
    {
        /// <summary>
        /// å½“前信息框对象
        /// </summary>
        AlertDialog.Builder builder;
        AlertDialog mAlertDialog;
        /// <summary>
        /// å¯¹è¯çª—
        /// </summary>
        /// <param name="title">标题</param>
        /// <param name="message">信息</param>
        /// <param name="cancelButtonText">取消按键备注,值null表示不显示取消按键</param>
        /// <param name="okButtonText">确认按键备注</param>
        public Alert (string title, string message, string cancelButtonText, string okButtonText)
        {
            //builder = new AlertDialog.Builder(Application.Activity);
            builder = new AlertDialog.Builder(new ContextThemeWrapper(Application.Activity, Resource.Style.ThemeDeviceDefaultLight));//改为浅色主题
            builder.SetMessage (message);
            builder.SetTitle (title);
            builder.SetCancelable (false);
            builder.SetPositiveButton (okButtonText, new EventHandler<DialogClickEventArgs> ((sender, e) => {
                ResultEventHandler?.Invoke(this, true);
            }));
            if (cancelButtonText != null) {
                builder.SetNegativeButton (cancelButtonText, new EventHandler<DialogClickEventArgs> ((sender, e) => {
                    ResultEventHandler?.Invoke(this, false);
                }));
            }
            mAlertDialog = builder.Create();
        }
        /// <summary>
        /// å¯¹è¯çª—
        /// </summary>
        /// <param name="title">标题</param>
        /// <param name="message">信息</param>
        /// <param name="okButtonText">确认按键备注</param>
        public Alert (string title, string message, string okButtonText) : this (title, message, null, okButtonText) { }
        /// <summary>
        /// ç»“果通知事件,true表示选中按键,false表示取消事件
        /// </summary>
        public Action<Alert, bool> ResultEventHandler;
        /// <summary>
        /// æ˜¾ç¤ºå½“前的界面
        /// </summary>
        public void Show()
        {
            if (mAlertDialog != null)
            {
                if (mAlertDialog.IsShowing)
                {
                    mAlertDialog.Dismiss();
                }
                mAlertDialog.Show();
            }
        }
        /// <summary>
        /// å…³é—­å½“前的界面
        /// </summary>
        public void Dismiss()
        {
            if (mAlertDialog != null && mAlertDialog.IsShowing)
            {
                mAlertDialog.Dismiss();
            }
        }
    }
}
ZigbeeApp/Shared.Droid/UI/Application.cs
New file
@@ -0,0 +1,229 @@
using System;
using Android.Graphics.Drawables;
using Android.Graphics;
using Android.Telephony;
using Android.Content;
namespace Shared
{
    /// <summary>
    /// UI处理类
    /// </summary>
    public class Application
    {
        /// <summary>
        /// èŽ·å–å®žé™…çš„é«˜åº¦
        /// </summary>
        /// <returns>The real height.</returns>
        /// <param name="height">Height.</param>
        public static int GetRealHeight(int height)
        {
            return (int)(height / HeightScale);
        }
        /// <summary>
        /// é»˜è®¤çš„字体大小
        /// </summary>
        public static float FontSize = 12;
        /// <summary>
        /// å½“前设备类型
        /// </summary>
        public static readonly Device DeviceType = Device.Android;
        /// <summary>
        /// èŽ·å–å®žé™…çš„å®½åº¦
        /// </summary>
        /// <returns>The real width.</returns>
        /// <param name="width">Width.</param>
        public static int GetRealWidth(int width)
        {
            return (int)(width / WidthScale);
        }
        public static void HideSoftInput()
        {
            var imm = (Android.Views.InputMethods.InputMethodManager)Application.Activity.GetSystemService(Context.InputMethodService);
            if (Shared.EditText.Instance != null)
            {
                imm.HideSoftInputFromWindow(Shared.EditText.Instance.AndroidView.WindowToken, 0); //强制隐藏键盘
            }
            else
            {
                imm.ToggleSoftInput(0, Android.Views.InputMethods.HideSoftInputFlags.NotAlways);
            }
        }
        /// <summary>
        /// èŽ·å–æœ€å°æ¯”ä¾‹çš„å®žé™…å€¼
        /// </summary>
        /// <returns>The minimum real.</returns>
        /// <param name="widthOrHeight">Width or height.</param>
        public static int GetMinReal(int widthOrHeight)
        {
            return (int)(widthOrHeight / MinScale);
        }
        /// <summary>
        /// èŽ·å–å¹³å‡å®žé™…å€¼
        /// </summary>
        /// <returns>The minimum real average.</returns>
        /// <param name="widthOrHeight">Width or height.</param>
        public static int GetMinRealAverage(int widthOrHeight)
        {
            return (int)(widthOrHeight / AverageScale);
        }
        public static void RunOnMainThread (Action action)
        {
            if (System.Threading.Thread.CurrentThread.ManagedThreadId == mainThreadId) {
                action ();
            } else {
                //System.Threading.Tasks.Task.Run (() => {
                Activity.RunOnUiThread (action);
                //});
            };
        }
        public static bool IsWifi;
        /// <summary>
        /// å½“前设备的宽度
        /// </summary>
        public static int CurrentWidth { get; internal set;}
        /// <summary>
        /// å½“前设备的高度
        /// </summary>
        public static int CurrentHeight { get; internal set; }
        /// <summary>
        /// å®½åº¦æ¯”例
        /// </summary>
        /// <value>The width scale.</value>
        public static float WidthScale
        {
            get
            {
                return DesignWidth * 1.0f / CurrentWidth;
            }
        }
        /// <summary>
        /// é«˜åº¦æ¯”例
        /// </summary>
        /// <value>The height scale.</value>
        public static float HeightScale
        {
            get
            {
                return DesignHeight * 1.0f / CurrentHeight;
            }
        }
        /// <summary>
        /// æœ€å°æ¯”例
        /// </summary>
        /// <value>The minimum scale.</value>
        public static float MinScale
        {
            get
            {
                return WidthScale < HeightScale ? WidthScale : HeightScale;
            }
        }
        /// <summary>
        /// å¹³å‡æ¯”例
        /// </summary>
        /// <value>The average scale.</value>
        public static float AverageScale
        {
            get
            {
                return (WidthScale + HeightScale)/2;
            }
        }
        /// <summary>
        ///  è®¾è®¡å®½åº¦
        /// </summary>
        public static int DesignWidth=640;
        /// <summary>
        /// è®¾è®¡é«˜åº¦
        /// </summary>
        public static int DesignHeight=1136;
        /// <summary>
        /// å½“前的Activity
        /// </summary>
        public static Android.App.Activity Activity { get; internal set;}
        /// <summary>
        /// å½“前主页
        /// </summary>
        /// <value>The main page.</value>
        public static Shared.FrameLayout MainPage
        {
            get;
            private set;
        }
        static int mainThreadId;
        static Android.Widget.FrameLayout rootFrameLayout;
        /// <summary>
        /// æ ¹å®¹å™¨è§†å›¾
        /// </summary>
        /// <value>The root frame layout.</value>
        public static Android.Widget.FrameLayout RootFrameLayout
        {
            get
            {
                return rootFrameLayout;
            }
            set
            {
                mainThreadId = System.Threading.Thread.CurrentThread.ManagedThreadId;
                rootFrameLayout = value;
                rootFrameLayout.LayoutParameters.Width = CurrentWidth;
                rootFrameLayout.LayoutParameters.Height = CurrentHeight;
                MainPage = new FrameLayout(value) { Width = value.Width, Height = value.Height,BackgroundColor=0xFF000000, Parent = new RootView() { Width = value.Width, Height = value.Height } };
                MainPage.Refresh();
            }
        }
        /// <summary>
        /// æ•°æ®æ–‡ä»¶æ ¹ç›®å½•
        /// </summary>
        /// <value>The root path.</value>
        public static readonly string RootPath=System.Environment.GetFolderPath(System.Environment.SpecialFolder.Personal)+"/";
        /// <summary>
        /// æ˜¯å¦æ˜¯pad
        /// </summary>
        public static bool IsPad
        {
            get {
                return false;
                //TelephonyManager telephony = (TelephonyManager)Activity.GetSystemService (Context.TelephonyService);
                //if (telephony.PhoneType == PhoneType.None) {
                //    return true;
                //} else {
                //    return false;
                //}
            }
        }
        /// <summary>
        /// çš®è‚¤ï¼Œnull时表示用默认的
        /// </summary>
        public static string Skin;
        /// <summary>
        /// GPS位置变化事件
        /// </summary>
        public static Action<double, double> LocationAction;
    }
}
ZigbeeApp/Shared.Droid/UI/ArcScaleSeekBar.cs
New file
@@ -0,0 +1,250 @@
using System;
using Android.Runtime;
using Android.Views;
using Com.Hdl.Widget;
namespace Shared
{
    /// <summary>
    /// ArcScaleSeekBar ç©ºè°ƒ åˆ»åº¦åœ†å¼§æŽ§ä»¶
    /// </summary>
    public class ArcScaleSeekBar : View
    {
        /// <summary>
        ///  å½“前视图
        /// </summary>
        /// <value>The HDLArcScaleSeekBar.</value>
        HDLArcScaleSeekBar mHDLArcScaleSeekBar
        {
            get
            {
                return AndroidView as HDLArcScaleSeekBar;
            }
            set
            {
                AndroidView = value;
            }
        }
        /// <summary>
        /// æž„造函数
        /// </summary>
        public ArcScaleSeekBar()
        {
            mHDLArcScaleSeekBar = new HDLArcScaleSeekBar(Application.Activity);
            mOnProgressChangeListener = new OnProgressChangeListener(this);
            mHDLArcScaleSeekBar.SetOnProgressChangeListener(mOnProgressChangeListener);
        }
        /// <summary>
        /// è¿›åº¦å€¼æ˜¾ç¤ºå•位
        /// </summary>
        /// <value>单位字符</value>
        public String ProgressBarUnitSring
        {
            set
            {
                mHDLArcScaleSeekBar.SetProgressBarUnitSring(value);
            }
        }
        /// <summary>
        /// è¿›åº¦å€¼æœ€å¤§å€¼
        /// </summary>
        /// <value>最大值</value>
        public int MaxValue
        {
            set
            {
                mHDLArcScaleSeekBar.SetMaxValue(value);
            }
        }
        /// <summary>
        /// è¿›åº¦å€¼æœ€å°å€¼
        /// </summary>
        /// <value>最小值</value>
        public int MinValue
        {
            set
            {
                mHDLArcScaleSeekBar.SetMinValue(value);
            }
        }
        /// <summary>
        /// å½“前进度值
        /// </summary>
        /// <value>进度值</value>
        public int Progress
        {
            set
            {
                mHDLArcScaleSeekBar.Progress = value;
            }
            get
            {
                return mHDLArcScaleSeekBar.Progress;
            }
        }
        /// <summary>
        /// å½“前进度值显示的文字颜色
        /// </summary>
        /// <value>文字颜色</value>
        public uint ProgressTextColor
        {
            set
            {
                byte r, g, b, a;
                r = (byte)(value / 256 / 256 % 256);
                g = (byte)(value / 256 % 256);
                b = (byte)(value % 256);
                a = (byte)(value / 256 / 256 / 256 % 256);
                mHDLArcScaleSeekBar.SetProgressTextColor(Android.Graphics.Color.Argb(a, r, g, b));
            }
        }
        /// <summary>
        /// å½“前进度值显示的文字大小
        /// </summary>
        /// <value>文字大小</value>
        public int ProgressTextSize
        {
            set => mHDLArcScaleSeekBar.SetProgressTextSize(value);
        }
        /// <summary>
        /// æ˜¯å¦å¯ä»¥æ»‘动
        /// </summary>
        /// <value>是否可以滑动</value>
        public bool IsClickable
        {
            set
            {
                mHDLArcScaleSeekBar.SetIsClickable(value);
            }
        }
        /// <summary>
        /// æ˜¯å¦å¯ä»¥æ»‘动
        /// </summary>
        /// <value>是否可以滑动</value>
        public bool IsProgressTextShow
        {
            set
            {
                mHDLArcScaleSeekBar.SetProgressTextShow(value);
            }
        }
        /// <summary>
        /// è®¾ç½®è¿›åº¦æ¡ æ¸å˜é¢œè‰²çš„开始颜色和结束颜色
        /// </summary>
        /// <value>开始颜色、结束颜色</value>
        public void SetProgressBarColors(uint startColor, uint endColor)
        {
            byte r, g, b, a;
            r = (byte)(startColor / 256 / 256 % 256);
            g = (byte)(startColor / 256 % 256);
            b = (byte)(startColor % 256);
            a = (byte)(startColor / 256 / 256 / 256 % 256);
            var start = Android.Graphics.Color.Argb(a, r, g, b);
            byte r2, g2, b2, a2;
            r2 = (byte)(endColor / 256 / 256 % 256);
            g2 = (byte)(endColor / 256 % 256);
            b2 = (byte)(endColor % 256);
            a2 = (byte)(endColor / 256 / 256 / 256 % 256);
            var end = Android.Graphics.Color.Argb(a2, r2, g2, b2);
            mHDLArcScaleSeekBar.SetStartColor(start);
            mHDLArcScaleSeekBar.SetEndColor(end);
        }
        /// <summary>
        /// æ˜¯å¦ç¦»çº¿ ç¦»çº¿çš„话禁止滑动并绘制背景遮挡层
        /// </summary>
        /// <value>是否离线</value>
        public bool IsOffline
        {
            set
            {
                mHDLArcScaleSeekBar.SetOffline(value);
            }
        }
        /// <summary>
        /// EventHandler
        /// </summary>
        public EventHandler<int> OnProgressChangedEvent;
        public EventHandler<bool> OnStartTrackingTouchEvent;
        public EventHandler<int> OnStopTrackingTouchEvent;
        /// <summary>
        /// OnProgressChangeListener ç»§æ‰¿å“åº”事件
        /// </summary>
        OnProgressChangeListener mOnProgressChangeListener;
        public class OnProgressChangeListener : Java.Lang.Object, HDLArcScaleSeekBar.IOnProgressChangeListener
        {
            ArcScaleSeekBar _ArcScaleSeekBar;
            public OnProgressChangeListener(ArcScaleSeekBar view)
            {
                _ArcScaleSeekBar = view;
            }
            public void OnProgressChanged(HDLArcScaleSeekBar p0, int p1, bool p2)
            {
                _ArcScaleSeekBar.OnProgressChangedEvent?.Invoke(this, p0.Progress);
            }
            public void OnStartTrackingTouch(HDLArcScaleSeekBar p0)
            {
                _ArcScaleSeekBar.OnStartTrackingTouchEvent?.Invoke(this, true);
            }
            public void OnStopTrackingTouch(HDLArcScaleSeekBar p0)
            {
                //if (_ArcScaleSeekBar.OnStopTrackingTouchEvent != null)
                //{
                //    _ArcScaleSeekBar.OnStopTrackingTouchEvent(this, p0.Progress);
                //}
                _ArcScaleSeekBar.OnStopTrackingTouchEvent?.Invoke(this, p0.Progress);
            }
        }
    }
}
ZigbeeApp/Shared.Droid/UI/ArcSeekBar.cs
New file
@@ -0,0 +1,357 @@
using System;
using Android.Runtime;
using Android.Views;
using Com.Hdl.Widget;
namespace Shared
{
    /// <summary>
    /// HDLArcSeekBar åœ†å¼§æ»‘动控件
    /// </summary>
    public class ArcSeekBar : View
    {
        /// <summary>
        ///  å½“前视图
        /// </summary>
        /// <value>The HDLArcSeekBar.</value>
        HDLArcSeekBar mHDLArcSeekBar
        {
            get
            {
                return AndroidView as HDLArcSeekBar;
            }
            set
            {
                AndroidView = value;
            }
        }
        /// <summary>
        /// æž„造函数
        /// </summary>
        public ArcSeekBar()
        {
            mHDLArcSeekBar = new HDLArcSeekBar(Application.Activity);
            mOnProgressChangeListener = new OnProgressChangeListener(this);
            mHDLArcSeekBar.SetOnProgressChangeListener(mOnProgressChangeListener);
        }
        //internal static ProgressChangeListener:Com.Hdl.Widget.HDLArcSeekBar.IOnProgressChangeListener(){
        //}
        /// <summary>
        /// è¿›åº¦å€¼æ˜¾ç¤ºå•位
        /// </summary>
        /// <value>单位字符</value>
        public String ProgressBarUnitSring
        {
            set
            {
                mHDLArcSeekBar.SetProgressBarUnitSring(value);
            }
        }
        /// <summary>
        /// è¿›åº¦å€¼æœ€å¤§å€¼
        /// </summary>
        /// <value>最大值</value>
        public int MaxValue
        {
            set
            {
                mHDLArcSeekBar.SetMaxValue(value);
            }
        }
        /// <summary>
        /// è¿›åº¦å€¼æœ€å°å€¼
        /// </summary>
        /// <value>最小值</value>
        public int MinValue
        {
            set
            {
                mHDLArcSeekBar.SetMinValue(value);
            }
        }
        /// <summary>
        /// å½“前进度值
        /// </summary>
        /// <value>进度值</value>
        public int Progress
        {
            set
            {
                mHDLArcSeekBar.Progress = value;
            }
            get
            {
                return mHDLArcSeekBar.Progress;
            }
        }
        /// <summary>
        /// åŒæ—¶è®¾ç½®åœ†å¼§å’Œæ‹–动圆形的宽
        /// </summary>
        /// <value>宽</value>
        public int ArcWidthWithDefaultStyle
        {
            set
            {
                mHDLArcSeekBar.SetArcWidthDefaultStyle(value);
            }
        }
        /// <summary>
        /// åœ†å¼§é»˜è®¤èƒŒæ™¯é¢œè‰²
        /// </summary>
        /// <value>背景颜色</value>
        public uint ArcColor
        {
            set
            {
                byte r, g, b, a;
                r = (byte)(value / 256 / 256 % 256);
                g = (byte)(value / 256 % 256);
                b = (byte)(value % 256);
                a = (byte)(value / 256 / 256 / 256 % 256);
                mHDLArcSeekBar.SetArcColor(Android.Graphics.Color.Argb(a, r, g, b));
            }
        }
        /// <summary>
        /// è¿›åº¦æ¡é¢œè‰² å•一颜色不渐变
        /// </summary>
        /// <value>单一进度条颜色</value>
        public uint ProgressBarColor
        {
            set
            {
                //mHDLArcSeekBar.SetProgressBarColor(value);
                byte r, g, b, a;
                r = (byte)(value / 256 / 256 % 256);
                g = (byte)(value / 256 % 256);
                b = (byte)(value % 256);
                a = (byte)(value / 256 / 256 / 256 % 256);
                mHDLArcSeekBar.SetProgressBarColor(Android.Graphics.Color.Argb(a, r, g, b));
            }
        }
        uint thumbColor = 0xFFFFFFFF;
        /// <summary>
        /// æ‹–动按钮圆形颜色
        /// </summary>
        /// <value>拖动按钮颜色</value>
        public uint ThumbColor
        {
            get
            {
                return thumbColor;
            }
            set
            {
                thumbColor = value;
                byte r, g, b, a;
                r = (byte)(thumbColor / 256 / 256 % 256);
                g = (byte)(thumbColor / 256 % 256);
                b = (byte)(thumbColor % 256);
                a = (byte)(thumbColor / 256 / 256 / 256 % 256);
                mHDLArcSeekBar.SetThumbColor(Android.Graphics.Color.Argb(a, r, g, b));
            }
        }
        /// <summary>
        /// æ‹–动按钮默认形状 å¡«æ»¡å®žå¿ƒæˆ–者空心
        /// </summary>
        /// <value>是否填满</value>
        public bool ThumbModeFill
        {
            set
            {
                if (value)
                {
                    mHDLArcSeekBar.SetThumbMode(Com.Hdl.Widget.HDLArcSeekBar.ThumbModeFill);
                }
                else
                {
                    mHDLArcSeekBar.SetThumbMode(Com.Hdl.Widget.HDLArcSeekBar.ThumbModeStroke);
                }
            }
        }
        /// <summary>
        /// æ‹–动按钮圆形半径
        /// </summary>
        /// <value>半径</value>
        public int ThumbRadius
        {
            set
            {
                mHDLArcSeekBar.SetThumbRadius(value);
            }
        }
        /// <summary>
        /// åœ†å¼§å®½
        /// </summary>
        /// <value>宽</value>
        public int ArcWidth
        {
            set
            {
                mHDLArcSeekBar.SetArcWidth(value);
            }
        }
        /// <summary>
        /// å½“前进度值显示的文字颜色
        /// </summary>
        /// <value>文字颜色</value>
        public uint ProgressTextColor
        {
            set
            {
                byte r, g, b, a;
                r = (byte)(value / 256 / 256 % 256);
                g = (byte)(value / 256 % 256);
                b = (byte)(value % 256);
                a = (byte)(value / 256 / 256 / 256 % 256);
                mHDLArcSeekBar.SetProgressTextColor(Android.Graphics.Color.Argb(a, r, g, b));
            }
        }
        /// <summary>
        /// å½“前进度值显示的文字大小
        /// </summary>
        /// <value>文字大小</value>
        public int ProgressTextSize
        {
            set => mHDLArcSeekBar.SetProgressTextSize(value);
        }
        /// <summary>
        /// æ˜¯å¦å¯ä»¥æ»‘动
        /// </summary>
        /// <value>是否可以滑动</value>
        public bool IsClickable
        {
            set
            {
                mHDLArcSeekBar.SetIsClickable(value);
            }
        }
        /// <summary>
        /// è®¾ç½®è¿›åº¦æ¡ æ¸å˜é¢œè‰²çš„开始颜色和结束颜色
        /// </summary>
        /// <value>开始颜色、结束颜色</value>
        public void SetProgressBarColors(uint startColor, uint endColor) {
            byte r, g, b, a;
            r = (byte)(startColor / 256 / 256 % 256);
            g = (byte)(startColor / 256 % 256);
            b = (byte)(startColor % 256);
            a = (byte)(startColor / 256 / 256 / 256 % 256);
            var start = Android.Graphics.Color.Argb(a, r, g, b);
            byte r2, g2, b2, a2;
            r2 = (byte)(endColor / 256 / 256 % 256);
            g2 = (byte)(endColor / 256 % 256);
            b2 = (byte)(endColor % 256);
            a2 = (byte)(endColor / 256 / 256 / 256 % 256);
            var end = Android.Graphics.Color.Argb(a2, r2, g2, b2);
            int[] mArcColors = { start, end };
            mHDLArcSeekBar.SetProgressBarColors(mArcColors);
        }
        //public void SetArcColors(uint startColor, uint endColor)
        //{
        //    byte r, g, b, a;
        //    r = (byte)(startColor / 256 / 256 % 256);
        //    g = (byte)(startColor / 256 % 256);
        //    b = (byte)(startColor % 256);
        //    a = (byte)(startColor / 256 / 256 / 256 % 256);
        //    var start = Android.Graphics.Color.Argb(a, r, g, b);
        //    byte r2, g2, b2, a2;
        //    r2 = (byte)(endColor / 256 / 256 % 256);
        //    g2 = (byte)(endColor / 256 % 256);
        //    b2 = (byte)(endColor % 256);
        //    a2 = (byte)(endColor / 256 / 256 / 256 % 256);
        //    var end = Android.Graphics.Color.Argb(a2, r2, g2, b2);
        //    int[] mArcColors = { start, end, end };
        //    mHDLArcSeekBar.SetArcColors(mArcColors);
        //}
        /// <summary>
        /// EventHandler
        /// </summary>
        public EventHandler<int> OnProgressChangedEvent;
        public EventHandler<bool> OnStartTrackingTouchEvent;
        public EventHandler<int> OnStopTrackingTouchEvent;
        /// <summary>
        /// OnProgressChangeListener ç»§æ‰¿å“åº”事件
        /// </summary>
        OnProgressChangeListener mOnProgressChangeListener;
        public class OnProgressChangeListener : Java.Lang.Object, HDLArcSeekBar.IOnProgressChangeListener
        {
            ArcSeekBar _ArcSeekBar;
            public OnProgressChangeListener(ArcSeekBar view)
            {
                _ArcSeekBar = view;
            }
            public void OnProgressChanged(HDLArcSeekBar p0, int p1, bool p2)
            {
                _ArcSeekBar.OnProgressChangedEvent?.Invoke(this, p0.Progress);
            }
            public void OnStartTrackingTouch(HDLArcSeekBar p0)
            {
                _ArcSeekBar.OnStartTrackingTouchEvent?.Invoke(this, true);
            }
            public void OnStopTrackingTouch(HDLArcSeekBar p0)
            {
                //if (_ArcSeekBar.OnStopTrackingTouchEvent != null)
                //{
                //    _ArcSeekBar.OnStopTrackingTouchEvent(this, p0.Progress);
                //}
                _ArcSeekBar.OnStopTrackingTouchEvent?.Invoke(this, p0.Progress);
            }
        }
    }
}
ZigbeeApp/Shared.Droid/UI/Button.cs
New file
@@ -0,0 +1,378 @@
using System;
using Android.Content;
using Android.Runtime;
using Android.Views;
using Android.Util;
using Android.Graphics.Drawables;
using Android.Views.Animations;
using Android.Graphics;
using Android.OS;
using Android.Views.InputMethods;
using Android.Text;
namespace Shared
{
        //已经全面检查了代码
        /// <summary>
        /// Button æŒ‰é”®
        /// </summary>
        public class Button : View
    {
        /// <summary>
        ///  å½“前视图
        /// </summary>
        /// <value>The android button.</value>
        AndroidButton currentButton {
            get {
                return AndroidView as AndroidButton;
            }
            set {
                AndroidView = value;
            }
        }
        /// <summary>
        /// æž„造函数
        /// </summary>
        public Button ()
        {
            currentButton = new AndroidButton (Application.Activity, this);
            currentButton.SetTextSize (ComplexUnitType.Sp, Application.FontSize);
        }
        byte[] imageBytes;
        public byte[] ImageBytes
        {
            get
            {
                return imageBytes;
            }
            set
            {
                imageBytes = value;
                IsSelected = isSelected;
            }
        }
        /// <summary>
        /// æ–‡å­—大小
        /// </summary>
        /// <value>The size of the text.</value>
        public float TextSize {
            get {
                return currentButton.TextSize;
            }
            set {
                currentButton.SetTextSize (ComplexUnitType.Sp, value);
            }
        }
        int textID;
        /// <summary>
        /// æ ¹æ®ID获取对应的备注
        /// </summary>
        /// <value>The text I.</value>
        public int TextID {
            get {
                return textID;
            }
            set {
                textID = value;
                Text = Language.StringByID (TextID);
            }
        }
        /// <summary>
        /// æ–‡æœ¬
        /// </summary>
        /// <value>The text.</value>
        public string Text {
            get {
                return currentButton.Text;
            }
            set {
                currentButton.Text = value;
            }
        }
        /// <summary>
        /// å­—体名称
        /// </summary>
        /// <value>The name of the font.</value>
        public string FontName {
            get {
                return "";
            }
            set {
                var typeFace = Typeface.CreateFromAsset (Shared.Application.Activity.Assets, "titilliumtext25l005.otf");
                if (typeFace != null) {
                    currentButton.SetTypeface (typeFace, TypefaceStyle.Normal);
                }
            }
        }
        bool isMoreLines;
        public bool IsMoreLines {
            get {
                return isMoreLines;
            }
            set {
                isMoreLines = value;
                currentButton.SetSingleLine (!value);
            }
        }
        /// <summary>
        /// åˆ·æ–°
        /// </summary>
        public override void Refresh ()
        {
            base.Refresh ();
            IsSelected = isSelected;
        }
        uint textColor = 0xFFFFFFFF;
        /// <summary>
        /// æ–‡å­—颜色
        /// </summary>
        /// <value>The color of the text.</value>
        public uint TextColor {
            get {
                return textColor;
            }
            set {
                textColor = value;
                if (IsSelected) {
                    return;
                }
                byte r, g, b, a;
                r = (byte)(textColor / 256 / 256 % 256);
                g = (byte)(textColor / 256 % 256);
                b = (byte)(textColor % 256);
                a = (byte)(textColor / 256 / 256 / 256 % 256);
                currentButton.SetTextColor (Android.Graphics.Color.Argb (a, r, g, b));
            }
        }
        uint selecteTextColor = 0xFFFFFFFF;
        /// <summary>
        /// æ–‡å­—颜色
        /// </summary>
        /// <value>The color of the text.</value>
        public uint SelectedTextColor {
            get {
                return selecteTextColor;
            }
            set {
                selecteTextColor = value;
                if (!IsSelected) {
                    return;
                }
                byte r, g, b, a;
                r = (byte)(selecteTextColor / 256 / 256 % 256);
                g = (byte)(selecteTextColor / 256 % 256);
                b = (byte)(selecteTextColor % 256);
                a = (byte)(selecteTextColor / 256 / 256 / 256 % 256);
                currentButton.SetTextColor (Android.Graphics.Color.Argb (a, r, g, b));
            }
        }
        bool isSelected;
        /// <summary>
        /// é€‰ä¸­çŠ¶æ€
        /// </summary>
        /// <value><c>true</c> if this instance is selected; otherwise, <c>false</c>.</value>
        public bool IsSelected {
            get {
                return isSelected;
            }
            set {
                isSelected = value;
                if (!IsCanRefresh) {
                    return;
                }
                if (isSelected) {
                    if (SelectedImagePath == null) {
                        SelectedBackgroundColor = SelectedBackgroundColor;
                    } else {
                        Background (SelectedImagePath);
                    }
                    SelectedTextColor = selecteTextColor;
                } else {
                    if (imageBytes != null)
                    {
                        AndroidView.Background = Bytes2Drawable(imageBytes);
                        return;
                    }
                    if (UnSelectedImagePath == null) {
                        BackgroundColor = BackgroundColor;
                    } else {
                        Background (UnSelectedImagePath);
                    }
                    TextColor = textColor;
                }
            }
        }
        TextAlignment textAlignment = TextAlignment.Center;
        /// <summary>
        /// æ–‡å­—对齐方式
        /// </summary>
        /// <param name="horizontalAlignment">横向</param>
        /// <param name="verticalAlignment">纵向</param>
        public TextAlignment TextAlignment {
            get {
                return textAlignment;
            }
            set {
                textAlignment = value;
                switch (value) {
                case TextAlignment.TopLeft:
                    currentButton.Gravity = GravityFlags.Top | GravityFlags.Left;
                    break;
                case TextAlignment.TopCenter:
                    currentButton.Gravity = GravityFlags.Top | GravityFlags.Center;
                    break;
                case TextAlignment.TopRight:
                    currentButton.Gravity = GravityFlags.Top | GravityFlags.Right;
                    break;
                case TextAlignment.CenterLeft:
                    currentButton.Gravity = GravityFlags.Center | GravityFlags.Left;
                    break;
                case TextAlignment.Center:
                    currentButton.Gravity = GravityFlags.Center | GravityFlags.Center;
                    break;
                case TextAlignment.CenterRight:
                    currentButton.Gravity = GravityFlags.Center | GravityFlags.Right;
                    break;
                case TextAlignment.BottomLeft:
                    currentButton.Gravity = GravityFlags.Bottom | GravityFlags.Left;
                    break;
                case TextAlignment.BottomCenter:
                    currentButton.Gravity = GravityFlags.Bottom | GravityFlags.Center;
                    break;
                case TextAlignment.BottomRight:
                    currentButton.Gravity = GravityFlags.Bottom | GravityFlags.Right;
                    break;
                }
            }
        }
        /// <summary>
        /// å†…边距
        /// </summary>
        /// <value>The padding.</value>
        public override Padding Padding {
            get {
                return new Padding (currentButton.PaddingTop, currentButton.PaddingLeft, currentButton.PaddingBottom, currentButton.PaddingRight);
            }
            set {
                currentButton.SetPadding (value.Left, value.Top, value.Right, value.Bottom);
            }
        }
        string selectedImagePath;
        /// <summary>
        /// é€‰æ‹©æ—¶èƒŒæ™¯å›¾è·¯å¾„
        /// </summary>
        /// <value>The selected image path.</value>
        public string SelectedImagePath {
            get {
                return selectedImagePath;
            }
            set {
                selectedImagePath = value;
                IsSelected = isSelected;
            }
        }
        string unSelectedImagePath;
        /// <summary>
        /// éžé€‰ä¸­çŠ¶æ€çš„èƒŒæ™¯å›¾è·¯å¾„
        /// </summary>
        /// <value>The un selected image path.</value>
        public string UnSelectedImagePath {
            get {
                return unSelectedImagePath;
            }
            set {
                unSelectedImagePath = value;
                IsSelected = isSelected;
            }
        }
        uint selectedBackgroundColor;
        /// <summary>
        /// é€‰æ‹©æ—¶èƒŒæ™¯é¢œè‰²
        /// </summary>
        /// <value>The color of the text.</value>
        public uint SelectedBackgroundColor {
            get {
                return selectedBackgroundColor;
            }
            set {
                selectedBackgroundColor = value;
                if (AndroidView.Background == null || AndroidView.Background.GetType () != typeof (GradientDrawable)) {
                    AndroidView.Background = new Android.Graphics.Drawables.GradientDrawable ();
                }
                var gradientDrawable = (GradientDrawable)AndroidView.Background;
                gradientDrawable.SetCornerRadius (DensityUtil.Dip2Px (Radius));
                byte r, g, b, a;
                r = (byte)(BorderColor / 256 / 256 % 256);
                g = (byte)(BorderColor / 256 % 256);
                b = (byte)(BorderColor % 256);
                a = (byte)(BorderColor / 256 / 256 / 256 % 256);
                gradientDrawable.SetStroke ((int)BorderWidth, Android.Graphics.Color.Argb (a, r, g, b));
                r = (byte)(selectedBackgroundColor / 256 / 256 % 256);
                g = (byte)(selectedBackgroundColor / 256 % 256);
                b = (byte)(selectedBackgroundColor % 256);
                a = (byte)(selectedBackgroundColor / 256 / 256 / 256 % 256);
                gradientDrawable.SetColor (Android.Graphics.Color.Argb (a, r, g, b).ToArgb ());
            }
        }
        internal class AndroidButton : Android.Widget.Button
        {
            View view;
            public AndroidButton (Context context, View view)
                : base (context)
            {
                this.view = view;
                SetBackgroundColor (Android.Graphics.Color.Transparent);
                SetPadding (0, 0, 0, 0);
                SetTextColor (Android.Graphics.Color.White);
                SetLines (1);
                SetEllipsize (true);
            }
            public override bool OnTouchEvent (MotionEvent e)
            {
                var v = base.OnTouchEvent (e);
                view?.TouchEvent (e);
                return true;
            }
            public void SetEllipsize (bool ellipsize) {
                if (ellipsize) {
                    Ellipsize = TextUtils.TruncateAt.End;
                } else {
                    Ellipsize = TextUtils.TruncateAt.Marquee;
                }
            }
            public override TextUtils.TruncateAt Ellipsize { get => base.Ellipsize; set => base.Ellipsize = value; }
        }
    }
}
ZigbeeApp/Shared.Droid/UI/Camera.cs
New file
@@ -0,0 +1,228 @@
using System;
using Android.Content;
using Android.App;
using Android.OS;
using Android.Graphics;
using Android.Widget;
using Android.Provider;
using Java.IO;
using Android.Graphics.Drawables;
namespace Shared
{
    [Activity(MainLauncher = false, Theme = "@android:style/Theme.NoTitleBar.Fullscreen")]
    internal class CameraActivity : Android.App.Activity
    {
        bool isZoom;
        protected override void OnCreate(Android.OS.Bundle savedInstanceState)
        {
            base.OnCreate(savedInstanceState);
            isZoom = Intent.Extras.GetBoolean("IsZoom", true);
            if (Intent.Extras.GetInt("Type") == Camera.TypePicture)
            {
                var intent = new Intent(Intent.ActionPick);
                intent.SetType("image/*");//相片类型
                StartActivityForResult(intent, Camera.TypePicture);
            }
            else
            {
                if (Android.OS.Environment.ExternalStorageState == Android.OS.Environment.MediaMounted)
                {
                    var getImageByCamera = new Intent("android.media.action.IMAGE_CAPTURE");
                    StartActivityForResult(getImageByCamera, Camera.TypeCamera);
                }
                else
                {
                    Toast.MakeText(Shared.Application.Activity, "Makue Sure SD Card", ToastLength.Long).Show();
                }
            }
        }
        /// <summary>
        /// å¤„理选择或者拍照的图片
        /// </summary>
        /// <param name="requestCode">Request code.</param>
        /// <param name="resultCode">Result code.</param>
        /// <param name="data">Data.</param>
        protected override void OnActivityResult(int requestCode, Result resultCode, Intent data)
        {
            try
            {
                base.OnActivityResult(requestCode, resultCode, data);
                if (Camera._callback == null)
                {
                    return;
                }
                if (resultCode != Result.Ok)
                {
                    Camera._callback(null);
                    return;
                }
                var path = System.IO.Path.Combine(Shared.Application.RootPath, Camera._fileName);
                var uri = data.Data;
                if (uri == null)
                {
                    var bundle = data.Extras;
                    if (bundle == null)
                    {
                        Toast.MakeText(Shared.Application.Activity, "Error", ToastLength.Long).Show();
                        path = null;
                    }
                    else
                    {
                        compressAndGenImage((Bitmap)bundle.Get("data"), path, 200);
                    }
                }
                else
                {
                    var photoPath = uri.Path;
                    if (!System.IO.File.Exists(photoPath))
                    {
                        //获取照片路径
                        string[] filePathColumn = { MediaStore.Audio.AudioColumns.Data };
                        var cursor = Shared.Application.Activity.ContentResolver.Query(uri, filePathColumn, null, null, null);
                        cursor.MoveToFirst();
                        photoPath = cursor.GetString(cursor.GetColumnIndex(filePathColumn[0]));
                        cursor.Close();
                    }
                    compressAndGenImage(BitmapFactory.DecodeFile(photoPath), path, 200);
                }
                Camera._callback(path);
            }
            finally
            {
                Finish();
            }
        }
        void compressAndGenImage(Bitmap bitmap, string outPath, int maxSize)
        {
            if (isZoom)
            {
                var width = bitmap.Width;
                var height = bitmap.Height;
                //System.Console.WriteLine("原宽度=" + bitmap.Width + "高度=" + bitmap.Height);
                var noScale = width * 1.0f / height;
                var scale = 16.0f / 9.0f;
                float x = 0, y = 0, w = width, h = height;
                if (scale < noScale)
                {
                    w = height * scale;
                    x = (width - w) / 2;
                }
                else
                {
                    h = width / scale;
                    y = (height - h) / 2;
                }
                var matrix = new Matrix();
                matrix.PostScale(Shared.Application.GetRealWidth(640) * 1.0f / w, Shared.Application.GetRealHeight(360) * 1.0f / h);
                bitmap = Bitmap.CreateBitmap(bitmap, (int)x, (int)y, (int)w, (int)h, matrix, true);
                //System.Console.WriteLine("现在宽度=" + bitmap.Width + "高度=" + bitmap.Height);
                var fs = new System.IO.FileStream(outPath, System.IO.FileMode.Create, System.IO.FileAccess.Write);
                // scale
                var options = 100;
                // Store the bitmap into output stream(no compress)
                bitmap.Compress(Bitmap.CompressFormat.Jpeg, options, fs);
                // Compress by loop
                while (fs.Length / 1024 > maxSize)
                {
                    // Clean up os
                    fs.Close();
                    // interval 10
                    options -= 10;
                    fs = new System.IO.FileStream(outPath, System.IO.FileMode.Create, System.IO.FileAccess.Write);
                    bitmap.Compress(Bitmap.CompressFormat.Jpeg, options, fs);
                }
                fs.Flush();
                fs.Close();
            }
            else
            {
                var fs = new System.IO.FileStream(outPath, System.IO.FileMode.Create, System.IO.FileAccess.Write);
                // scale
                var options = 100;
                // Store the bitmap into output stream(no compress)
                bitmap.Compress(Bitmap.CompressFormat.Jpeg, options, fs);
                fs.Flush();
                fs.Close();
            }
        }
    }
    /// <summary>
    /// æ‹ç…§æˆ–者选择图片
    /// </summary>
    public static class Camera
    {
        /// <summary>
        /// æ‹ç…§æˆ–者读取图片完成时调用的动作,string==null表示用户取消了拍照或者取消选择图片,string!=null,表示图片的路径
        /// </summary>
        internal static Action<string> _callback;
        /// <summary>
        /// æ–‡ä»¶å
        /// </summary>
        internal static string _fileName;
        /// <summary>
        /// é€‰æ‹©ç±»åž‹æ˜¯æ‹ç…§
        /// </summary>
        internal static readonly int TypeCamera = 0xFF0001;
        /// <summary>
        /// é€‰æ‹©å›¾ç‰‡
        /// </summary>
        internal static readonly int TypePicture = 0xFF0002;
        /// <summary>
        /// æ‹ç…§
        /// </summary>
        /// <param name="callback">回调函数</param>
        /// <param name="fileName">文件名</param>
        public static void TakePicture(Action<string> callback, string fileName,bool isZoom=true)
        {
            (Application.Activity as BaseActivity)?.SetCamera((obj) => {
                if(obj){
                    _callback = callback;
                    var intent = new Intent(Application.Activity, typeof(CameraActivity));
                    intent.PutExtra("Type", TypeCamera);
                    intent.PutExtra("IsZoom", isZoom);
                    Application.Activity?.StartActivity(intent);
                }
                else{
                    callback?.Invoke(null);
                }
            });
            _fileName = fileName;
        }
        /// <summary>
        /// é€‰æ‹©å›¾ç‰‡
        /// </summary>
        /// <param name="callback">回调函数</param>
        /// <param name="fileName">文件名</param>
        public static void SelectPicture(Action<string> callback, string fileName, bool isZoom = true)
        {
            (Application.Activity as BaseActivity)?.SetImagePermission((obj) =>
            {
                if (obj)
                {
                    _fileName = fileName;
                    _callback = callback;
                    var intent = new Intent(Application.Activity, typeof(CameraActivity));
                    intent.PutExtra("Type", TypePicture);
                    intent.PutExtra("IsZoom", isZoom);
                    Application.Activity?.StartActivity(intent);
                }else{
                    callback?.Invoke(null);
                }
            });
        }
    }
}
ZigbeeApp/Shared.Droid/UI/ColorPicker.cs
New file
@@ -0,0 +1,123 @@
using System;
using Android.Content;
using Android.Graphics;
using Android.Graphics.Drawables;
using Android.Util;
using Android.Views;
namespace Shared
{
    /// <summary>
    /// è‰²æ¿
    /// </summary>
    public class ColorPicker : View
    {
        MyColorPickerView myColorPickerView {
            get {
                return AndroidView as MyColorPickerView;
            }
            set {
                AndroidView = value;
            }
        }
        /// <summary>
        /// Initializes a new instance of the <see cref="Shared.Button"/> class.
        /// </summary>
        public ColorPicker()
        {
            myColorPickerView = new MyColorPickerView(Application.Activity,this);
        }
        string colorImagePath;
        /// <summary>
        /// è‰²æ¿å›¾
        /// </summary>
        /// <value>The color image path.</value>
        public string ColorImagePath {
            get {
                return colorImagePath;
            }
            set {
                colorImagePath = value;
                Background (colorImagePath);
            }
        }
        /// <summary>
        /// é¢œè‰²å˜åŒ–
        /// </summary>
        public Action<View, byte[]> ColorChaged;
        public class MyColorPickerView : Android.Views.View
        {
            Bitmap bitmapTemp;
            View _view;
            public MyColorPickerView(Context context, View view)
                : base(context)
            {
                _view = view;
            }
            public override Android.Graphics.Drawables.Drawable Background
            {
                get
                {
                    return base.Background;
                }
                set
                {
                    base.Background = value;
                    bitmapTemp = drawableToBitmap(value);
                }
            }
            static Bitmap drawableToBitmap(Drawable drawable)
            {
                if (drawable == null)
                {
                    return null;
                }
                var bitmap = Bitmap.CreateBitmap(drawable.IntrinsicWidth,drawable.IntrinsicHeight,Bitmap.Config.Rgb565);
                Canvas canvas = new Canvas(bitmap);
                drawable.SetBounds(0, 0, drawable.IntrinsicWidth, drawable.IntrinsicHeight);
                drawable.Draw(canvas);
                return bitmap;
            }
            /// <summary>
            /// é‡å†™ç‚¹å‡»äº‹ä»¶
            /// </summary>
            /// <returns><c>true</c>, if touch event was oned, <c>false</c> otherwise.</returns>
            /// <param name="e">E.</param>
            public override bool OnTouchEvent(MotionEvent e)
            {
                if (_view != null && _view.Enable)
                {
                    _view.TouchEvent( e);
                }
                if (bitmapTemp != null && (_view as ColorPicker).ColorChaged != null)
                {
                    int x = Math.Abs((int)(e.GetX() * bitmapTemp.Width / Width));
                    int y = Math.Abs((int)(e.GetY() * bitmapTemp.Height / Height));
                    if (bitmapTemp.Width <= x) {
                        x = bitmapTemp.Width - 1;
                    }
                    if (bitmapTemp.Height <= y) {
                        y = bitmapTemp.Height - 1;
                    }
                    var color = bitmapTemp.GetPixel(x,y);
                    (_view as ColorPicker).ColorChaged(_view, new byte[] { (byte)((color >> 16) & 0xFF), (byte)((color >> 8) & 0xFF), (byte)(color & 0xFF) });
                    //Console.WriteLine("ColorChaged color:" + color);
                }
                //return base.OnTouchEvent(e);
                return true;//2019-09-09 æ”¹ä¸º  return true
            }
        }
    }
}
ZigbeeApp/Shared.Droid/UI/Contacts.cs
New file
@@ -0,0 +1,27 @@
using System;
using Android.Content;
namespace Shared
{
    public static class Contacts
    {
        public static Action<string,string> ContactAction;
        public static void Open()
        {
            (Shared.Application.Activity as BaseActivity).SetContactsPermission((b) => {
                if (b)
                {
                    // è·³è½¬åˆ°è”系人界面
                    var intent = new Intent();
                    intent.SetAction("android.intent.action.PICK");
                    intent.AddCategory("android.intent.category.DEFAULT");
                    intent.SetType("vnd.android.cursor.dir/phone_v2");
                    Shared.Application.Activity.StartActivityForResult(intent, 0x30);
                }
                else {
                    ContactAction?.Invoke(null, null);
                }
            });
        }
    }
}
ZigbeeApp/Shared.Droid/UI/CropImage.cs
New file
@@ -0,0 +1,126 @@
using System;
using Android.Content;
using Com.Hdl.Widget.Cropimage;
using Com.Hdl.Widget;
using static Com.Hdl.Widget.Cropimage.HDLCropImageActivity;
namespace Shared
{
    /// <summary>
    /// æ‹ç…§æˆ–者选择图片
    /// </summary>
    public static class CropImage
    {
        ///// <summary>
        ///// æ‹ç…§æˆ–者读取图片完成时调用的动作,string==null表示用户取消了拍照或者取消选择图片,string!=null,表示图片的路径
        ///// </summary>
        //internal static Action<string> _callback;
        ///// <summary>
        ///// æ–‡ä»¶å
        ///// </summary>
        //internal static string _fileName;
        ///// <summary>
        /// é€‰æ‹©ç±»åž‹æ˜¯æ‹ç…§
        /// </summary>
        internal static readonly int TypeCamera = 101;
        /// <summary>
        /// é€‰æ‹©å›¾ç‰‡
        /// </summary>
        internal static readonly int TypePicture = 102;
        /// <summary>
        /// æ‹ç…§
        /// </summary>
        /// <param name="callback">回调函数</param>
        /// <param name="fileName">文件名</param>
        /// <param name="mRATIO_X">宽高比的宽值</param>
        /// <param name="mRATIO_Y">宽高比的高值</param>
        /// <param name="OutputYSize">图片大小 åˆ†è¾¨çŽ‡é«˜å€¼ï¼Œè¯¥å€¼ä¸èƒ½è¿‡é«˜ï¼Œä¼šå†…å­˜ä¸è¶³ä¼ é€’ä¸äº†è£å‰ªå›¾ç‰‡èµ„æº 300以内<</param>
        public static void TakePicture(Action<string> callback, string fileName, int mRATIO_X = 1, int mRATIO_Y = 1, int OutputYSize = 200)
        {
            (Application.Activity as BaseActivity)?.SetCamera((obj) => {
                if(obj){
                    //_callback = callback;
                    HDLCropImageActivity.MOnCropImageeCallback = new OnCropImageeCallback(callback);
                    var intent = new Intent(Application.Activity, typeof(HDLCropImageActivity));
                    intent.PutExtra(HDLUtlisXM.CropTypeKey, TypeCamera);
                    intent.PutExtra(HDLUtlisXM.CropNameKey, fileName);
                    intent.PutExtra(HDLUtlisXM.CropRatioXKey, mRATIO_X);
                    intent.PutExtra(HDLUtlisXM.CropRatioYKey, mRATIO_Y);
                    intent.PutExtra(HDLUtlisXM.CropOutputYKey, OutputYSize);
                    //intent.PutExtra("IsZoom", isZoom);
                    Application.Activity?.StartActivity(intent);
                }
                else{
                    callback?.Invoke(null);
                }
            });
            //_fileName = fileName;
        }
        /// <summary>
        /// é€‰æ‹©å›¾ç‰‡
        /// <param name="callback">回调函数</param>
        /// <param name="fileName">文件名</param>
        /// <param name="mRATIO_X">宽高比的宽值</param>
        /// <param name="mRATIO_Y">宽高比的高值</param>
        /// <param name="OutputYSize">图片大小 åˆ†è¾¨çŽ‡é«˜å€¼ï¼Œè¯¥å€¼ä¸èƒ½è¿‡é«˜ï¼Œä¼šå†…å­˜ä¸è¶³ä¼ é€’ä¸äº†è£å‰ªå›¾ç‰‡èµ„æº 300以内</param>
        public static void SelectPicture(Action<string> callback, string fileName, int mRATIO_X = 1, int mRATIO_Y = 1, int OutputYSize = 200)
        {
            (Application.Activity as BaseActivity)?.SetImagePermission((obj) =>
            {
                if (obj)
                {
                    //_fileName = fileName;
                    //_callback = callback;
                    HDLCropImageActivity.MOnCropImageeCallback = new OnCropImageeCallback(callback);
                    var intent = new Intent(Application.Activity, typeof(HDLCropImageActivity));
                    intent.PutExtra(HDLUtlisXM.CropTypeKey, TypePicture);
                    intent.PutExtra(HDLUtlisXM.CropNameKey, fileName);
                    intent.PutExtra(HDLUtlisXM.CropRatioXKey, mRATIO_X);
                    intent.PutExtra(HDLUtlisXM.CropRatioYKey, mRATIO_Y);
                    intent.PutExtra(HDLUtlisXM.CropOutputYKey, OutputYSize);
                    //intent.PutExtra("IsZoom", isZoom);
                    Application.Activity?.StartActivity(intent);
                }else{
                    callback?.Invoke(null);
                }
            });
        }
        /// <summary>
        /// OnCropImageeCallback
        /// </summary>
        public class OnCropImageeCallback : Java.Lang.Object, IOnCropImageeCallback
        {
            Action<string> mAction;
            public OnCropImageeCallback(Action<string> action)
            {
                mAction = action;
            }
            public void OnSaveCallback(string p0)
            {
                mAction?.Invoke(p0);
            }
        }
    }
}
ZigbeeApp/Shared.Droid/UI/CurtainRollSeekBar.cs
New file
@@ -0,0 +1,245 @@
using System;
using Android.Runtime;
using Android.Views;
using Com.Hdl.Widget;
namespace Shared
{
    /// <summary>
    /// CurtainRollSeekBar å·å¸˜æ»‘动控件
    /// </summary>
    public class CurtainRollSeekBar : View
    {
        /// <summary>
        ///  å½“前视图
        /// </summary>
        /// <value>The HDLRollCurtainSeekBar.</value>
        HDLRollCurtainSeekBar mHDLRollCurtainSeekBar
        {
            get
            {
                return AndroidView as HDLRollCurtainSeekBar;
            }
            set
            {
                AndroidView = value;
            }
        }
        /// <summary>
        /// æž„造函数
        /// </summary>
        public CurtainRollSeekBar()
        {
            mHDLRollCurtainSeekBar = new HDLRollCurtainSeekBar(Application.Activity);
            mOnProgressChangeListener = new OnProgressChangeListener(this);
            mHDLRollCurtainSeekBar.SetOnProgressChangeListener(mOnProgressChangeListener);
            //SeekBarPadding = 5;
            //CurtainPaddingTop = 10;
        }
        //internal static ProgressChangeListener:Com.Hdl.Widget.HDLRollCurtainSeekBar.IOnProgressChangeListener(){
        //}
        /// <summary>
        /// è¿›åº¦å€¼æ˜¾ç¤ºå•位
        /// </summary>
        /// <value>单位字符</value>
        public String ProgressBarUnitSring
        {
            set
            {
                mHDLRollCurtainSeekBar.SetProgressBarUnitSring(value);
            }
        }
        /// <summary>
        /// è¿›åº¦å€¼æœ€å¤§å€¼
        /// </summary>
        /// <value>最大值</value>
        public int MaxValue
        {
            set
            {
                mHDLRollCurtainSeekBar.SetMaxValue(value);
            }
        }
        /// <summary>
        /// è¿›åº¦å€¼æœ€å°å€¼
        /// </summary>
        /// <value>最小值</value>
        public int MinValue
        {
            set
            {
                mHDLRollCurtainSeekBar.SetMinValue(value);
            }
        }
        /// <summary>
        /// å½“前进度值
        /// </summary>
        /// <value>进度值</value>
        public int Progress
        {
            set
            {
                mHDLRollCurtainSeekBar.Progress = value;
            }
            get
            {
                return mHDLRollCurtainSeekBar.Progress;
            }
        }
        /// <summary>
        /// å½“前进度值显示的文字颜色
        /// </summary>
        /// <value>文字颜色</value>
        public uint ProgressTextColor
        {
            set
            {
                byte r, g, b, a;
                r = (byte)(value / 256 / 256 % 256);
                g = (byte)(value / 256 % 256);
                b = (byte)(value % 256);
                a = (byte)(value / 256 / 256 / 256 % 256);
                mHDLRollCurtainSeekBar.SetProgressTextColor(Android.Graphics.Color.Argb(a, r, g, b));
            }
        }
        /// <summary>
        /// å½“前进度值显示的文字大小
        /// </summary>
        /// <value>文字大小</value>
        public int ProgressTextSize
        {
            set => mHDLRollCurtainSeekBar.SetProgressTextSize(value);
        }
        /// <summary>
        /// æ˜¯å¦å¯ä»¥æ»‘动
        /// </summary>
        /// <value>是否可以滑动</value>
        public bool IsClickable
        {
            set
            {
                mHDLRollCurtainSeekBar.SetIsClickable(value);
            }
        }
        /// <summary>
        /// æ˜¯å¦å¯ä»¥æ»‘动
        /// </summary>
        /// <value>是否可以滑动</value>
        public bool IsProgressTextShow
        {
            set
            {
                mHDLRollCurtainSeekBar.SetProgressTextShow(value);
            }
        }
        /// <summary>
        /// è¿›åº¦æ¡ä¸Žå·¦å³è¾¹æ¡†è¾¹è·
        /// </summary>
        public int CurtainPaddingLeftRight
        {
            set
            {
                mHDLRollCurtainSeekBar.SetCurtainPadding(value);
            }
        }
        /// <summary>
        /// é¡¶éƒ¨padding
        /// </summary>
        public int CurtainPaddingTop
        {
            set
            {
                mHDLRollCurtainSeekBar.SetCurtainPaddingTop(value);
            }
        }
        /// <summary>
        /// æ˜¯å¦ç¦»çº¿ ç¦»çº¿çš„话禁止滑动并绘制背景遮挡层
        /// </summary>
        /// <value>是否离线</value>
        public bool IsOffline
        {
            set
            {
                mHDLRollCurtainSeekBar.SetOffline(value);
            }
        }
        /// <summary>
        /// EventHandler
        /// </summary>
        public EventHandler<int> OnProgressChangedEvent;
        public EventHandler<bool> OnStartTrackingTouchEvent;
        public EventHandler<int> OnStopTrackingTouchEvent;
        /// <summary>
        /// OnProgressChangeListener ç»§æ‰¿å“åº”事件
        /// </summary>
        OnProgressChangeListener mOnProgressChangeListener;
        public class OnProgressChangeListener : Java.Lang.Object, HDLRollCurtainSeekBar.IOnProgressChangeListener
        {
            CurtainRollSeekBar _CurtainRollSeekBar;
            public OnProgressChangeListener(CurtainRollSeekBar view)
            {
                _CurtainRollSeekBar = view;
            }
            public void OnProgressChanged(HDLRollCurtainSeekBar p0, int p1, bool p2)
            {
                _CurtainRollSeekBar.OnProgressChangedEvent?.Invoke(this, p0.Progress);
            }
            public void OnStartTrackingTouch(HDLRollCurtainSeekBar p0)
            {
                _CurtainRollSeekBar.OnStartTrackingTouchEvent?.Invoke(this, true);
            }
            public void OnStopTrackingTouch(HDLRollCurtainSeekBar p0)
            {
                //if (_CurtainSeekBar.OnStopTrackingTouchEvent != null)
                //{
                //    _CurtainSeekBar.OnStopTrackingTouchEvent(this, p0.Progress);
                //}
                _CurtainRollSeekBar.OnStopTrackingTouchEvent?.Invoke(this, p0.Progress);
            }
        }
    }
}
ZigbeeApp/Shared.Droid/UI/CurtainSeekBar.cs
New file
@@ -0,0 +1,249 @@
using System;
using Android.Runtime;
using Android.Views;
using Com.Hdl.Widget;
namespace Shared
{
    /// <summary>
    /// CurtainSeekBar å¼€åˆå¸˜æ»‘动控件
    /// </summary>
    public class CurtainSeekBar : View
    {
        /// <summary>
        ///  å½“前视图
        /// </summary>
        /// <value>The HDLOACCurtainSeekBar.</value>
        HDLOACCurtainSeekBar mHDLOACCurtainSeekBar
        {
            get
            {
                return AndroidView as HDLOACCurtainSeekBar;
            }
            set
            {
                AndroidView = value;
            }
        }
        /// <summary>
        /// æž„造函数
        /// </summary>
        public CurtainSeekBar()
        {
            mHDLOACCurtainSeekBar = new HDLOACCurtainSeekBar(Application.Activity);
            mOnProgressChangeListener = new OnProgressChangeListener(this);
            mHDLOACCurtainSeekBar.SetOnProgressChangeListener(mOnProgressChangeListener);
        }
        //internal static ProgressChangeListener:Com.Hdl.Widget.HDLOACCurtainSeekBar.IOnProgressChangeListener(){
        //}
        /// <summary>
        /// è¿›åº¦å€¼æ˜¾ç¤ºå•位
        /// </summary>
        /// <value>单位字符</value>
        public String ProgressBarUnitSring
        {
            set
            {
                mHDLOACCurtainSeekBar.SetProgressBarUnitSring(value);
            }
        }
        /// <summary>
        /// è¿›åº¦å€¼æœ€å¤§å€¼
        /// </summary>
        /// <value>最大值</value>
        public int MaxValue
        {
            set
            {
                mHDLOACCurtainSeekBar.SetMaxValue(value);
            }
        }
        /// <summary>
        /// è¿›åº¦å€¼æœ€å°å€¼
        /// </summary>
        /// <value>最小值</value>
        public int MinValue
        {
            set
            {
                mHDLOACCurtainSeekBar.SetMinValue(value);
            }
        }
        /// <summary>
        /// å½“前进度值
        /// </summary>
        /// <value>进度值</value>
        public int Progress
        {
            set
            {
                mHDLOACCurtainSeekBar.Progress = value;
            }
            get
            {
                return mHDLOACCurtainSeekBar.Progress;
            }
        }
        /// <summary>
        /// å½“前进度值显示的文字颜色
        /// </summary>
        /// <value>文字颜色</value>
        public uint ProgressTextColor
        {
            set
            {
                byte r, g, b, a;
                r = (byte)(value / 256 / 256 % 256);
                g = (byte)(value / 256 % 256);
                b = (byte)(value % 256);
                a = (byte)(value / 256 / 256 / 256 % 256);
                mHDLOACCurtainSeekBar.SetProgressTextColor(Android.Graphics.Color.Argb(a, r, g, b));
            }
        }
        /// <summary>
        /// å½“前进度值显示的文字大小
        /// </summary>
        /// <value>文字大小</value>
        public int ProgressTextSize
        {
            set => mHDLOACCurtainSeekBar.SetProgressTextSize(value);
        }
        /// <summary>
        /// æ˜¯å¦å¯ä»¥æ»‘动
        /// </summary>
        /// <value>是否可以滑动</value>
        public bool IsClickable
        {
            set
            {
                mHDLOACCurtainSeekBar.SetIsClickable(value);
            }
        }
        /// <summary>
        /// æ˜¯å¦å¯ä»¥æ»‘动
        /// </summary>
        /// <value>是否可以滑动</value>
        public bool IsProgressTextShow
        {
            set
            {
                mHDLOACCurtainSeekBar.SetProgressTextShow(value);
            }
        }
        /// <summary>
        /// è¿›åº¦æ¡ä¸Žå·¦å³è¾¹æ¡†è¾¹è·
        /// </summary>
        public int CurtainPaddingLeftRight
        {
            set
            {
                mHDLOACCurtainSeekBar.SetCurtainPadding(value);
            }
        }
        /// <summary>
        /// é¡¶éƒ¨padding
        /// </summary>
        public int CurtainPaddingTop
        {
            set
            {
                mHDLOACCurtainSeekBar.SetCurtainPaddingTop(value);
            }
        }
        /// <summary>
        /// æ˜¯å¦ç¦»çº¿ ç¦»çº¿çš„话禁止滑动并绘制背景遮挡层
        /// </summary>
        /// <value>是否离线</value>
        public bool IsOffline
        {
            set
            {
                mHDLOACCurtainSeekBar.SetOffline(value);
            }
        }
        /// <summary>
        /// EventHandler
        /// </summary>
        public EventHandler<int> OnProgressChangedEvent;
        public EventHandler<bool> OnStartTrackingTouchEvent;
        public EventHandler<int> OnStopTrackingTouchEvent;
        /// <summary>
        /// OnProgressChangeListener ç»§æ‰¿å“åº”事件
        /// </summary>
        OnProgressChangeListener mOnProgressChangeListener;
        public class OnProgressChangeListener : Java.Lang.Object, HDLOACCurtainSeekBar.IOnProgressChangeListener
        {
            CurtainSeekBar _CurtainSeekBar;
            public OnProgressChangeListener(CurtainSeekBar view)
            {
                _CurtainSeekBar = view;
            }
            public void OnProgressChanged(HDLOACCurtainSeekBar p0, int p1, bool p2)
            {
                _CurtainSeekBar.OnProgressChangedEvent?.Invoke(this, p0.Progress);
            }
            public void OnStartTrackingTouch(HDLOACCurtainSeekBar p0)
            {
                _CurtainSeekBar.OnStartTrackingTouchEvent?.Invoke(this, true);
            }
            public void OnStopTrackingTouch(HDLOACCurtainSeekBar p0)
            {
                //if (_CurtainSeekBar.OnStopTrackingTouchEvent != null)
                //{
                //    _CurtainSeekBar.OnStopTrackingTouchEvent(this, p0.Progress);
                //}
                _CurtainSeekBar.OnStopTrackingTouchEvent?.Invoke(this, p0.Progress);
            }
        }
    }
}
ZigbeeApp/Shared.Droid/UI/DateView.cs
New file
@@ -0,0 +1,74 @@
using Android.Content;
using Android.Runtime;
using Android.Util;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Android.Views;
namespace Shared
{
    /// <summary>
    /// æ—¥æœŸè§†å›¾
    /// </summary>
    public class DateView : View
    {
        /// <summary>
        /// å½“前视图
        /// </summary>
        /// <value>The android text.</value>
        AndroidDatePicker currentAndroidDatePicker
        {
            get
            {
                return AndroidView as AndroidDatePicker;
            }
            set
            {
                AndroidView = value;
            }
        }
        /// <summary>
        /// å¹´
        /// </summary>
        public int Year
        {
            get { return currentAndroidDatePicker.Year; }
        }
        /// <summary>
        /// æœˆ
        /// </summary>
        public int Month
        {
            get { return currentAndroidDatePicker.Month; }
        }
        /// <summary>
        /// å¤©
        /// </summary>
        public int Day
        {
            get { return currentAndroidDatePicker.DayOfMonth; }
        }
        /// <summary>
        /// å®žä¾‹
        /// </summary>
        public DateView()
        {
            currentAndroidDatePicker = new AndroidDatePicker(Application.Activity);
        }
        /// <summary>
        /// Android åŽŸç”Ÿ AndroidDatePicker
        /// </summary>
        class AndroidDatePicker : Android.Widget.DatePicker
        {
            public AndroidDatePicker(Context context)
                : base(context)
            { }
        }
    }
}
ZigbeeApp/Shared.Droid/UI/Dialog.cs
New file
@@ -0,0 +1,156 @@
using System;
namespace Shared
{
    /// <summary>
    /// å¼¹çª—视图
    /// </summary>
    public class Dialog
    {
        Button tempButton;
        FrameLayout mainFrameLayout;
        /// <summary>
        /// å¼¹çª—视图构造函数
        /// </summary>
        public Dialog ()
        {
            Application.MainPage.AddChidren (tempButton = new Button () { Visible = false, Width = LayoutParams.MatchParent, Height = LayoutParams.MatchParent, BackgroundColor = 0x88323232 });
            Application.MainPage.AddChidren (mainFrameLayout = new FrameLayout () { Visible = false, Tag = "Dialog" });
        }
        /// <summary>
        /// èƒŒæ™¯é¢œè‰²
        /// </summary>
        /// <value>The color of the background.</value>
        public uint BackgroundColor {
            get {
                return mainFrameLayout.BackgroundColor;
            }
            set {
                mainFrameLayout.BackgroundColor = value;
            }
        }
        /// <summary>
        /// åœ†è§’大小
        /// </summary>
        /// <value>The corner.</value>
        public uint Radius {
            get {
                return mainFrameLayout.Radius;
            }
            set {
                mainFrameLayout.Radius = value;
            }
        }
        /// <summary>
        /// è¾¹æ¡†çº¿å¤§å°
        /// </summary>
        /// <value>The width of the border.</value>
        public uint BorderWidth {
            get {
                return mainFrameLayout.BorderWidth;
            }
            set {
                mainFrameLayout.BorderWidth = value;
            }
        }
        /// <summary>
        /// å¢žåŠ å­æŽ§ä»¶
        /// </summary>
        /// <param name="view">View.</param>
        public void AddChidren (View view)
        {
            mainFrameLayout.AddChidren (view);
        }
        /// <summary>
        /// èƒŒæ™¯å›¾ç‰‡è·¯å¾„
        /// </summary>
        /// <value>The background image path.</value>
        public string BackgroundImagePath {
            get {
                return mainFrameLayout.BackgroundImagePath;
            }
            set {
                mainFrameLayout.BackgroundImagePath = value;
            }
        }
        /// <summary>
        /// å®½åº¦
        /// </summary>
        /// <value>The width.</value>
        public int Width {
            get {
                return mainFrameLayout.Width;
            }
            set {
                mainFrameLayout.Width = value;
            }
        }
        /// <summary>
        /// é«˜å®½
        /// </summary>
        /// <value>The height.</value>
        public int Height {
            get {
                return mainFrameLayout.Height;
            }
            set {
                mainFrameLayout.Height = value;
            }
        }
        /// <summary>
        /// X
        /// </summary>
        /// <value>The height.</value>
        public int X {
            get {
                return mainFrameLayout.X;
            }
            set {
                mainFrameLayout.X = value;
            }
        }
        /// <summary>
        /// Y
        /// </summary>
        /// <value>The height.</value>
        public int Y {
            get {
                return mainFrameLayout.Y;
            }
            set {
                mainFrameLayout.Y = value;
            }
        }
        /// <summary>
        /// æ˜¾ç¤ºå½“前的界面
        /// </summary>
        public void Show ()
        {
            tempButton.Visible = true;
            mainFrameLayout.Visible = true;
            mainFrameLayout.Gravity = Gravity.Center;
            tempButton.BringToFront ();
            mainFrameLayout.BringToFront ();
        }
        /// <summary>
        /// å…³é—­å½“前的界面,释放资源
        /// </summary>
        public void Close ()
        {
            tempButton.RemoveFromParent ();
            mainFrameLayout.RemoveFromParent ();
        }
        //public void RemoveFromParent ()
        //{
        //    Console.WriteLine ("Dialog RemoveFromParent!!!");
        //    tempButton.RemoveFromParent ();
        //    mainFrameLayout.RemoveFromParent ();
        //}
    }
}
ZigbeeApp/Shared.Droid/UI/DrawerLayout (¸±±¾).cs
New file
@@ -0,0 +1,340 @@
//using System;
//using Android.Content;
//using Android.Views;
//using Android.Util;
//using Android.Runtime;
//using Android.Widget;
//using Android.OS;
//using Android.Views.Animations;
//namespace Shared
//{
//    //已经全面检查了代码
//    /// <summary>
//    /// åœ¨æ»‘动事件下,可显示隐藏些自定义视图
//    /// </summary>
//    public class DrawerLayout : ViewGroup
//    {
//        AndroidDrawerLayout androidDrawerLayout;
//        //uint lineColor = 0x62818181;
//        ///// <summary>
//        ///// èƒŒæ™¯é¢œè‰²
//        ///// </summary>
//        ///// <value>The color of the background.</value>
//        //public virtual uint LineColor
//        //{
//        //    get
//        //    {
//        //        return lineColor;
//        //    }
//        //    set
//        //    {
//        //        lineColor = value;
//        //        byte r, g, b, a;
//        //        r = (byte)(lineColor / 256 / 256 % 256);
//        //        g = (byte)(lineColor / 256 % 256);
//        //        b = (byte)(lineColor % 256);
//        //        a = (byte)(lineColor / 256 / 256 / 256 % 256);
//        //        lineLinearLayout.SetBackgroundColor(Android.Graphics.Color.Argb(a, r, g, b));
//        //    }
//        //}
//        /// <summary>
//        /// å®½åº¦è®¾ç½®æˆ–读取
//        /// </summary>
//        /// <value>The width.</value>
//        public override int Width
//        {
//            get
//            {
//                return base.Width;
//            }
//            set
//            {
//                base.Width = value;
//                if (!IsCanRefresh)
//                {
//                    return;
//                }
//                var layoutParameters = androidDrawerLayout.LayoutParameters;
//                layoutParameters.Width = Width;
//                androidDrawerLayout.LayoutParameters = layoutParameters;
//            }
//        }
//        /// <summary>
//        /// è§†å›¾é«˜åº¦
//        /// </summary>
//        /// <value>The height.</value>
//        public override int Height
//        {
//            get
//            {
//                return base.Height;
//            }
//            set
//            {
//                base.Height = value;
//                if (!IsCanRefresh)
//                {
//                    return;
//                }
//                var layoutParameters = androidDrawerLayout.LayoutParameters;
//                layoutParameters.Height = Height;
//                androidDrawerLayout.LayoutParameters = layoutParameters;
//            }
//        }
//        Android.Widget.FrameLayout leftLinarLayout;
//        //Android.Widget.LinearLayout rightLinarLayout;
//        //Android.Widget.LinearLayout lineLinearLayout;
//        /// <summary>
//        /// åœ¨æ»‘动事件下,可显示隐藏些自定义视图
//        /// </summary>
//        public DrawerLayout()
//        {
//            viewGroup = new Android.Widget.RelativeLayout(Application.Activity);
//            androidDrawerLayout = new AndroidDrawerLayout(Application.Activity, this) { };
//            androidDrawerLayout.LeftToRightAction += () =>
//            {
//                openLeftMenu();
//            };
//            realViewGroup = androidDrawerLayout;
//            leftLinarLayout = new Android.Widget.FrameLayout(Application.Activity) {  Alpha = 0.0f };
//            //rightLinarLayout = new Android.Widget.LinearLayout(Application.Activity) { Orientation = Android.Widget.Orientation.Horizontal, Alpha = 0.0f };
//            //lineLinearLayout = new Android.Widget.LinearLayout(Application.Activity);
//            //LineColor = lineColor;
//            viewGroup.AddView(leftLinarLayout, new Android.Views.ViewGroup.LayoutParams(Android.Views.ViewGroup.LayoutParams.WrapContent, Android.Views.ViewGroup.LayoutParams.MatchParent));
//            //viewGroup.AddView(rightLinarLayout, new Android.Views.ViewGroup.LayoutParams(Android.Views.ViewGroup.LayoutParams.WrapContent, Android.Views.ViewGroup.LayoutParams.MatchParent));
//            viewGroup.AddView(androidDrawerLayout, new Android.Views.ViewGroup.LayoutParams(Android.Views.ViewGroup.LayoutParams.MatchParent, Android.Views.ViewGroup.LayoutParams.MatchParent));
//            //viewGroup.AddView(lineLinearLayout, new Android.Widget.FrameLayout.LayoutParams(Android.Views.ViewGroup.LayoutParams.MatchParent, DensityUtil.Dip2Px(1), Android.Views.GravityFlags.Bottom));
//        }
//        void openLeftMenu()
//        {
//            //if (androidDrawerLayout.isShowRight)
//            //{
//            //    hideRightMenu();
//            //    return;
//            //}
//            if (leftLinarLayout.ChildCount == 0)
//                return;
//            androidDrawerLayout.isShowLeft = true;
//            Android.Widget.FrameLayout.LayoutParams lp = (Android.Widget.FrameLayout.LayoutParams)leftLinarLayout.LayoutParameters;
//            lp.RightMargin = 0;
//            leftLinarLayout.LayoutParameters = lp;
//            leftLinarLayout.Alpha = 1.0f;
//            if (leftLinarLayout.Animation == null)
//            {
//                leftLinarLayout.Animation = new TranslateAnimation(
//                    Dimension.RelativeToSelf, -androidDrawerLayout.LayoutParameters.Width,
//                    Dimension.RelativeToSelf, 0,
//                    Dimension.RelativeToSelf, 0,
//                    Dimension.RelativeToSelf, 0);
//                leftLinarLayout.Animation.Duration = 200;
//            }
//            //   Animation = leftUIView.Animation;
//            //Animation.Reset();
//            //Animation.StartNow();
//            leftLinarLayout.Animation.Reset();
//            leftLinarLayout.Animation.StartNow();
//            System.Console.WriteLine("DrawerLayout:openLeftMenu");
//            //            UIView.Animate (0.2f, 0.0f, UIViewAnimationOptions.BeginFromCurrentState, () => {
//            //                contentView.X = (int)leftUIView.Frame.Width;
//            //                leftUIView.Alpha = 1.0f;
//            //            }, () => {
//            //
//            //            });
//        }
//        void hideLeftMenu()
//        {
//            androidDrawerLayout.isShowLeft = false;
//            Android.Widget.FrameLayout.LayoutParams lp = (Android.Widget.FrameLayout.LayoutParams)leftLinarLayout.LayoutParameters;
//            lp.RightMargin = androidDrawerLayout.LayoutParameters.Width;
//            leftLinarLayout.LayoutParameters = lp;
//            leftLinarLayout.Alpha = 0.0f;
//            //            UIView.Animate(0.2f,0.0f,UIViewAnimationOptions.BeginFromCurrentState,()=>{
//            //                contentView.X=0;
//            //                leftUIView.Alpha=0.0f;
//            //            },()=>{
//            //
//            //            });
//        }
//        /// <summary>
//        /// å­è§†å›¾çš„宽度
//        /// </summary>
//        //int subViewWidth = 100;
//        /// <summary>
//        /// å¢žåŠ å·¦è¾¹è§†å›¾
//        /// </summary>
//        /// <param name="view">View.</param>
//        public void AddLeftView(View view)
//        {
//            leftLinarLayout.AddView(view.AndroidView, new Android.Views.ViewGroup.LayoutParams(androidDrawerLayout.LayoutParameters.Width, androidDrawerLayout.LayoutParameters.Height));
//            leftLinarLayout.LayoutParameters.Width = androidDrawerLayout.LayoutParameters.Width;
//            view.Parent = this;
//            view.Width = androidDrawerLayout.LayoutParameters.Width;
//            view.Height = androidDrawerLayout.LayoutParameters.Height;
//        }
//        class AndroidDrawerLayout : Android.Widget.FrameLayout
//        {
//            View _view;
//            int mTouchSlop
//            {
//                get
//                {
//                    var configuration = ViewConfiguration.Get(Context);
//                    //最小的滑动距离
//                    return configuration.ScaledTouchSlop;
//                }
//            }
//            public AndroidDrawerLayout(Context context, View view)
//                : base(context)
//            {
//                _view = view;
//            }
//            float mLastX, mLastY;
//            internal bool isShowLeft;
//            internal bool isShowRight;
//            public Action RightToLeftAction;
//            public Action LeftToRightAction;
//            bool isActioned;
//            bool action(MotionEvent e)
//            {
//                switch (e.Action)
//                {
//                    case MotionEventActions.Down:
//                        //记录点击的最新X坐标
//                        mLastX = e.RawX;
//                        mLastY = e.RawY;
//                        Parent?.RequestDisallowInterceptTouchEvent(true);
//                        break;
//                    case MotionEventActions.Move:
//                        var x = e.RawX;
//                        var y = e.RawY;
//                        var deltaX = x - mLastX;
//                        var deltaY = y - mLastY;
//                        if (Math.Abs(deltaY) < Math.Abs(deltaX))
//                        {
//                            if (!isActioned)
//                            {
//                                //RightToLeftAction
//                                if (deltaX < -mTouchSlop)
//                                {
//                                    isActioned = true;
//                                    //parentDelay(true);
//                                    System.Console.WriteLine("DrawerLayout:DispatchTouchEvent:RightToLeft");
//                                    RightToLeftAction?.Invoke();
//                                }
//                                //LeftToRightAction
//                                if (mTouchSlop < deltaX)
//                                {
//                                    isActioned = true;
//                                    //parentDelay(true);
//                                    System.Console.WriteLine("DrawerLayout:DispatchTouchEvent:LeftToRight");
//                                    LeftToRightAction?.Invoke();
//                                }
//                            }
//                            return true;
//                        }
//                        else
//                        {
//                            //上下滑动时,允许父控件的拦截
//                            if (4 < Math.Abs(deltaY))
//                            {
//                                Parent?.RequestDisallowInterceptTouchEvent(false);
//                            }
//                        }
//                        break;
//                }
//                return false;
//            }
//            /// <summary>
//            /// æ‰§è¡ŒOnInterceptTouchEvent和OnTouchEvent
//            /// </summary>
//            /// <returns><c>true</c>事件已经处理<c>false</c>事件没有处理</returns>
//            /// <param name="e">E.</param>
//            public override bool DispatchTouchEvent(MotionEvent e)
//            {
//                System.Console.WriteLine($"{GetType()} Height->{Height} Width->{Width} DispatchTouchEvent->{e.Action}");
//                if (e.Action == MotionEventActions.Down)
//                {
//                    isActioned = false;
//                    //还原允许拦截事件
//                    RequestDisallowInterceptTouchEvent(false);
//                }
//                return base.DispatchTouchEvent(e);
//            }
//            public override bool OnInterceptTouchEvent(MotionEvent e)
//            {
//                System.Console.WriteLine($"{GetType()} Height->{Height} Width->{Width} OnInterceptTouchEvent->{e.Action}");
//                if (disallowIntercept)
//                {
//                    return false;
//                }
//                if (action(e))
//                {
//                    return true;
//                }
//                return base.OnInterceptTouchEvent(e);
//            }
//            /// <summary>
//            /// é‡å†™ç‚¹å‡»äº‹ä»¶
//            /// </summary>
//            /// <returns><c>true</c>, if touch event was oned, <c>false</c> otherwise.</returns>
//            /// <param name="e">E.</param>
//            public override bool OnTouchEvent(MotionEvent e)
//            {
//                System.Console.WriteLine($"{GetType()} Height->{Height} Width->{Width} OnTouchEvent->{e.Action}");
//                if (!isActioned)
//                {
//                    _view.TouchEvent(e);
//                }
//                action(e);
//                return true;
//            }
//            bool disallowIntercept;
//            public override void RequestDisallowInterceptTouchEvent(bool disallowIntercept)
//            {
//                this.disallowIntercept = disallowIntercept;
//                System.Console.WriteLine($"{GetType()} Height->{Height} RequestDisallowInterceptTouchEvent->{disallowIntercept}");
//                base.RequestDisallowInterceptTouchEvent(disallowIntercept);
//                Parent?.RequestDisallowInterceptTouchEvent(disallowIntercept);
//            }
//        }
//    }
//}
ZigbeeApp/Shared.Droid/UI/EditText.cs
New file
@@ -0,0 +1,548 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Android.App;
using Android.Content;
using Android.OS;
using Android.Runtime;
using Android.Views;
using Android.Widget;
using Android.Util;
using Android.Views.InputMethods;
using Android.Text;
using Android.Graphics.Drawables;
using Android.Graphics;
namespace Shared
{
    /// <summary>
    /// EditText
    /// </summary>
    public class EditText : View
    {
        public Action<View, FocusEventArgs> FoucsChanged;
        /// <summary>
        /// å½“前视图
        /// </summary>
        /// <value>The android text.</value>
        AndroidEditText currentAndroidEditText
        {
            get
            {
                return AndroidView as AndroidEditText;
            }
            set
            {
                AndroidView = value;
            }
        }
        public static EditText Instance;
        public Action<View, string> KeyEventAction;
        public EditText()
        {
            Instance = this;
            currentAndroidEditText = new AndroidEditText(Application.Activity,this);
            TextSize = Application.FontSize;
            currentAndroidEditText.ViewAttachedToWindow += CurrentAndroidEditText_ViewAttachedToWindow;
            currentAndroidEditText.ViewDetachedFromWindow += CurrentAndroidEditText_ViewDetachedFromWindow;
        }
        private void CurrentAndroidEditText_TextChanged(object sender, TextChangedEventArgs e)
        {
            TextChangeEventHandler?.Invoke(this, e.Text.ToString());
        }
        private void CurrentAndroidEditText_FocusChange(object sender, Android.Views.View.FocusChangeEventArgs e)
        {
            FoucsChanged?.Invoke(this, new FocusEventArgs { Focus = e.HasFocus });
        }
        private void CurrentAndroidEditText_EditorAction(object sender, Android.Widget.TextView.EditorActionEventArgs e)
        {
            //if (e.Event == null)
            //{
            //    return;
            //}
            if (e.ActionId == ImeAction.Send ||
            e.ActionId == ImeAction.Done ||
            e.ActionId == ImeAction.Next ||
            e.ActionId == ImeAction.Search ||
            (e.Event != null && e.Event.Action == KeyEventActions.Down && e.Event.KeyCode == Keycode.Enter))
            {
                Application.HideSoftInput();
                EditorEnterAction?.Invoke(this);
            }
        }
        private void CurrentAndroidEditText_ViewDetachedFromWindow(object sender, Android.Views.View.ViewDetachedFromWindowEventArgs e)
        {
            ClearAllViewEvent();
        }
        private void CurrentAndroidEditText_ViewAttachedToWindow(object sender, Android.Views.View.ViewAttachedToWindowEventArgs e)
        {
            InitAllViewEvent();
        }
        internal override void InitAllViewEvent()
        {
            base.InitAllViewEvent();
            currentAndroidEditText.TextChanged += CurrentAndroidEditText_TextChanged;
            currentAndroidEditText.FocusChange += CurrentAndroidEditText_FocusChange;
            currentAndroidEditText.EditorAction += CurrentAndroidEditText_EditorAction;
        }
        internal override void ClearAllViewEvent()
        {
            base.ClearAllViewEvent();
            currentAndroidEditText.TextChanged -= CurrentAndroidEditText_TextChanged;
            currentAndroidEditText.FocusChange -= CurrentAndroidEditText_FocusChange;
            currentAndroidEditText.EditorAction -= CurrentAndroidEditText_EditorAction;
        }
        public bool Foucs
        {
            get
            {
                return currentAndroidEditText.IsFocused;
            }
            set
            {
                currentAndroidEditText.Focusable = value;
                currentAndroidEditText.RequestFocus();
                currentAndroidEditText.FocusableInTouchMode = value;
                currentAndroidEditText.RequestFocusFromTouch();
                if (value) {
                    var imm = (InputMethodManager)Application.Activity.GetSystemService(Context.InputMethodService);
                    imm.ShowSoftInput(AndroidView, ShowFlags.Forced);
                }
            }
        }
        public Action<View> EditorEnterAction;
        /// <summary>
        /// æ–‡å­—大小
        /// </summary>
        /// <value>The size of the text.</value>
        public float TextSize
        {
            get
            {
                return currentAndroidEditText.TextSize;
            }
            set
            {
                currentAndroidEditText.SetTextSize(ComplexUnitType.Sp, value);
            }
        }
        /// <summary>
        /// æ–‡æœ¬
        /// </summary>
        /// <value>The text.</value>
        public string Text
        {
            get
            {
                return currentAndroidEditText.Text;
            }
            set
            {
                if (value == null)
                    currentAndroidEditText.Text = "";
                else
                    currentAndroidEditText.Text = value.TrimEnd('\0');
            }
        }
        int textID;
        /// <summary>
        /// æ ¹æ®ID获取对应的备注
        /// </summary>
        /// <value>The text I.</value>
        public int TextID
        {
            get
            {
                return textID;
            }
            set
            {
                textID = value;
                Text = Language.StringByID(TextID);
            }
        }
        /// <summary>
        /// æ˜¯å¦ä½¿èƒ½
        /// </summary>
        /// <value>true</value>
        /// <c>false</c>
        public override bool Enable
        {
            get
            {
                return currentAndroidEditText.Enabled;
            }
            set
            {
                currentAndroidEditText.Enabled = value;
            }
        }
        /// <summary>
        /// æ˜¾ç¤ºæç¤ºä¿¡æ¯
        /// </summary>
        /// <value>The placeholder.</value>
        public string PlaceholderText
        {
            get
            {
                return currentAndroidEditText.Hint;
            }
            set
            {
                currentAndroidEditText.Hint = value;
            }
        }
        uint placeholderTextColor;
        /// <summary>
        /// Gets or sets the color of the placeholder text.
        /// </summary>
        /// <value>The color of the placeholder text.</value>
        public uint PlaceholderTextColor
        {
            get
            {
                return placeholderTextColor;
            }
            set
            {
                placeholderTextColor = value;
                byte r, g, b, a;
                r = (byte)(placeholderTextColor / 256 / 256 % 256);
                g = (byte)(placeholderTextColor / 256 % 256);
                b = (byte)(placeholderTextColor % 256);
                a = (byte)(placeholderTextColor / 256 / 256 / 256 % 256);
                currentAndroidEditText.SetHintTextColor(Android.Graphics.Color.Argb(a, r, g, b));
            }
        }
        /// <summary>
        /// æ˜¯å¦ç”¨*号隐藏字符
        /// </summary>
        /// <value>The secure text entry.</value>
        public bool SecureTextEntry
        {
            get
            {
                return currentAndroidEditText.InputType != InputTypes.TextVariationVisiblePassword;
            }
            set
            {
                if (value)
                {
                    currentAndroidEditText.InputType = InputTypes.ClassText | InputTypes.TextVariationPassword;
                }
                else
                {
                    currentAndroidEditText.InputType =  InputTypes.TextVariationVisiblePassword;
                }
            }
        }
        bool isSelected;
        /// <summary>
        /// Gets or sets a value indicating whether this instance is selected.
        /// </summary>
        /// <value><c>true</c> if this instance is selected; otherwise, <c>false</c>.</value>
        public bool IsSelected
        {
            get
            {
                return isSelected;
            }
            set
            {
                isSelected = value;
                if (!IsCanRefresh) {
                    return;
                }
                if (isSelected)
                {
                    if (SelectedImagePath == null)
                    {
                        SelectedBackgroundColor = SelectedBackgroundColor;
                    }
                    else
                    {
                        if (!Background(SelectedImagePath))
                        {
                            BackgroundColor = BackgroundColor;
                        }
                    }
                }
                else
                {
                    if (UnSelectedImagePath == null)
                    {
                        BackgroundColor = BackgroundColor;
                    }
                    else
                    {
                        if (!Background(UnSelectedImagePath))
                        {
                            BackgroundColor = BackgroundColor;
                        }
                    }
                }
            }
        }
        uint selectedBackgroundColor;
        /// <summary>
        /// é€‰æ‹©æ—¶èƒŒæ™¯é¢œè‰²
        /// </summary>
        /// <value>The color of the text.</value>
        public uint SelectedBackgroundColor
        {
            get
            {
                return selectedBackgroundColor;
            }
            set
            {
                selectedBackgroundColor = value;
                if (AndroidView.Background == null || AndroidView.Background.GetType() != typeof(GradientDrawable))
                {
                    AndroidView.Background = new Android.Graphics.Drawables.GradientDrawable();
                }
                var gradientDrawable = (GradientDrawable)AndroidView.Background;
                gradientDrawable.SetCornerRadius(DensityUtil.Dip2Px(Radius));
                byte r, g, b, a;
                r = (byte)(BorderColor / 256 / 256 % 256);
                g = (byte)(BorderColor / 256 % 256);
                b = (byte)(BorderColor % 256);
                a = (byte)(BorderColor / 256 / 256 / 256 % 256);
                gradientDrawable.SetStroke((int)BorderWidth, Android.Graphics.Color.Argb(a, r, g, b));
                r = (byte)(selectedBackgroundColor / 256 / 256 % 256);
                g = (byte)(selectedBackgroundColor / 256 % 256);
                b = (byte)(selectedBackgroundColor % 256);
                a = (byte)(selectedBackgroundColor / 256 / 256 / 256 % 256);
                gradientDrawable.SetColor(Android.Graphics.Color.Argb(a, r, g, b).ToArgb());
            }
        }
        /// <summary>
        /// åˆ·æ–°å¤§å°
        /// </summary>
        public override void Refresh()
        {
            base.Refresh();
            IsSelected = isSelected;
        }
        uint textColor;
        /// <summary>
        /// æ–‡å­—颜色
        /// </summary>
        /// <value>The color of the text.</value>
        public uint TextColor
        {
            get
            {
                return textColor;
            }
            set
            {
                textColor = value;
                byte r, g, b, a;
                r = (byte)(textColor / 256 / 256 % 256);
                g = (byte)(textColor / 256 % 256);
                b = (byte)(textColor % 256);
                a = (byte)(textColor / 256 / 256 / 256 % 256);
                currentAndroidEditText.SetTextColor(Android.Graphics.Color.Argb(a, r, g, b));
            }
        }
        public static int FocusBottom{
            get{
                return AndroidEditText.Bottom;
            }
        }
        //大家新年好!编译人生代码,运行幸福程序;升级应用功能,超出项目需求。2019年,你的幸福数据在加载中。。。。。
        TextAlignment textAlignment = TextAlignment.Center;
        /// <summary>
        /// Texts the alignment.
        /// </summary>
        /// <param name="horizontalAlignment">Horizontal alignment.</param>
        /// <param name="verticalAlignment">Vertical alignment.</param>
        public TextAlignment TextAlignment
        {
            get
            {
                return textAlignment;
            }
            set
            {
                textAlignment = value;
                switch (value)
                {
                    case TextAlignment.TopLeft:
                        currentAndroidEditText.Gravity = GravityFlags.Top | GravityFlags.Left;
                        break;
                    case TextAlignment.TopCenter:
                        currentAndroidEditText.Gravity = GravityFlags.Top | GravityFlags.Center;
                        break;
                    case TextAlignment.TopRight:
                        currentAndroidEditText.Gravity = GravityFlags.Top | GravityFlags.Right;
                        break;
                    case TextAlignment.CenterLeft:
                        currentAndroidEditText.Gravity = GravityFlags.Center | GravityFlags.Left;
                        break;
                    case TextAlignment.Center:
                        currentAndroidEditText.Gravity = GravityFlags.Center | GravityFlags.Center;
                        break;
                    case TextAlignment.CenterRight:
                        currentAndroidEditText.Gravity = GravityFlags.Center | GravityFlags.Right;
                        break;
                    case TextAlignment.BottomLeft:
                        currentAndroidEditText.Gravity = GravityFlags.Bottom | GravityFlags.Left;
                        break;
                    case TextAlignment.BottomCenter:
                        currentAndroidEditText.Gravity = GravityFlags.Bottom | GravityFlags.Center;
                        break;
                    case TextAlignment.BottomRight:
                        currentAndroidEditText.Gravity = GravityFlags.Bottom | GravityFlags.Right;
                        break;
                }
            }
        }
        /// <summary>
        /// é€‰æ‹©æ—¶èƒŒæ™¯å›¾è·¯å¾„
        /// </summary>
        /// <value>The selected image path.</value>
        public string SelectedImagePath { get; set; }
        /// <summary>
        /// éžé€‰ä¸­çŠ¶æ€çš„èƒŒæ™¯å›¾è·¯å¾„
        /// </summary>
        /// <value>The un selected image path.</value>
        public string UnSelectedImagePath { get; set; }
        /// <summary>
        /// è¾“入文字变化事件
        /// </summary>
        public Action<View, string> TextChangeEventHandler;
        public void SetSingleLine(bool bSingle, int maxLines = 3)
        {
            currentAndroidEditText.SetSingleLine(bSingle);
            if (!bSingle) {
                currentAndroidEditText.SetMaxLines(maxLines);
            }
        }
        class AndroidEditText : Android.Widget.EditText
        {
            EditText editText;
            public AndroidEditText(Context context,EditText editText)
                : base(context)
            {
                SetTextColor(Android.Graphics.Color.White);
                SetPadding(0, 0, 0, 0);
                TextAlignment = Android.Views.TextAlignment.Center;
                SetSingleLine(true);
                this.editText = editText;
            }
            protected override void OnFocusChanged (bool gainFocus, [GeneratedEnum] FocusSearchDirection direction, Rect previouslyFocusedRect)
            {
                base.OnFocusChanged (gainFocus, direction, previouslyFocusedRect);
                var location = new int[2];
                this.GetLocationOnScreen(location);
                if (gainFocus) {
                    Bottom = location [1] + this.Height;
                }
                else{
                    Bottom = 0;
                }
            }
            public override bool OnKeyDown([GeneratedEnum] Keycode keyCode, KeyEvent e)
            {
                if (e != null && e.KeyCode == Keycode.Del && e.Action == KeyEventActions.Down)
                {
                    editText?.KeyEventAction?.Invoke(editText,"Del");
                }
                return base.OnKeyDown(keyCode, e);
            }
            public static int Bottom;
            //public override Android.Views.InputMethods.IInputConnection OnCreateInputConnection(Android.Views.InputMethods.EditorInfo outAttrs)
            //{
            //    return new ZanyInputConnection(base.OnCreateInputConnection(outAttrs), true,this);
            //}
            //class ZanyInputConnection : InputConnectionWrapper,ISpannable
            //{
            //    AndroidEditText androidEditText;
            //    public ZanyInputConnection(IInputConnection target, bool mutable,AndroidEditText androidText):base(target,mutable)
            //    {
            //        this.androidEditText = androidText;
            //    }
            //    public override bool SendKeyEvent(KeyEvent e)
            //    {
            //        if (e.Action == KeyEventActions.Down && e.KeyCode == Keycode.Del)
            //        {
            //            string text = androidEditText.Text;
            //            if (text.Length > 0)
            //            {
            //                string newText = text.Substring(0, text.Length - 1);
            //                androidEditText.Text=newText;
            //                Selection.SetSelection(this, newText.Length);
            //            }
            //            return false;
            //        }
            //        return base.SendKeyEvent(e);
            //    }
            //}
        }
    }
    public class FocusEventArgs : EventArgs
    {
        /// <summary>
        /// true ä¸ºèŽ·å–åˆ°ç„¦ç‚¹
        /// false ç„¦ç‚¹æ¶ˆå¤±
        /// </summary>
        public bool Focus;
    }
}
ZigbeeApp/Shared.Droid/UI/EditTextView.cs
New file
@@ -0,0 +1,546 @@
using System;
using Android.Content;
using Android.Runtime;
using Android.Views;
using Android.Util;
using Android.Views.InputMethods;
using Android.Text;
using Android.Graphics.Drawables;
using Android.Graphics;
namespace Shared
{
    /// <summary>
    /// EditTextView æ–‡æœ¬è¾“入框
    /// æ”¯æŒæ¢è¡Œ
    /// </summary>
    public class EditTextView : View
    {
        public Action<View, FocusEventArgs> FoucsChanged;
        /// <summary>
        /// å½“前视图
        /// </summary>
        /// <value>The android text.</value>
        AndroidEditText currentAndroidEditText
        {
            get
            {
                return AndroidView as AndroidEditText;
            }
            set
            {
                AndroidView = value;
            }
        }
        public static EditTextView Instance;
        public Action<View, string> KeyEventAction;
        public EditTextView()
        {
            Instance = this;
            currentAndroidEditText = new AndroidEditText(Application.Activity,this);
            //currentAndroidEditText.SetSingleLine(false);
            //currentAndroidEditText.SetMaxLines(10);
            //TextSize = Application.FontSize;
            TextSize = 14;
            currentAndroidEditText.ViewAttachedToWindow += CurrentAndroidEditText_ViewAttachedToWindow;
            currentAndroidEditText.ViewDetachedFromWindow += CurrentAndroidEditText_ViewDetachedFromWindow;
        }
        private void CurrentAndroidEditText_TextChanged(object sender, TextChangedEventArgs e)
        {
            TextChangeEventHandler?.Invoke(this, e.Text.ToString());
        }
        private void CurrentAndroidEditText_FocusChange(object sender, Android.Views.View.FocusChangeEventArgs e)
        {
            FoucsChanged?.Invoke(this, new FocusEventArgs { Focus = e.HasFocus });
        }
        //private void CurrentAndroidEditText_EditorAction(object sender, Android.Widget.TextView.EditorActionEventArgs e)
        //{
        //    //if (e.Event == null)
        //    //{
        //    //    return;
        //    //}
        //    if (e.ActionId == ImeAction.Send ||
        //    e.ActionId == ImeAction.Done ||
        //    e.ActionId == ImeAction.Next ||
        //    e.ActionId == ImeAction.Search ||
        //    (e.Event != null && e.Event.Action == KeyEventActions.Down && e.Event.KeyCode == Keycode.Enter))
        //    {
        //        //Application.HideSoftInput();
        //        //EditorEnterAction?.Invoke(this);
        //    }
        //}
        private void CurrentAndroidEditText_ViewDetachedFromWindow(object sender, Android.Views.View.ViewDetachedFromWindowEventArgs e)
        {
            ClearAllViewEvent();
        }
        private void CurrentAndroidEditText_ViewAttachedToWindow(object sender, Android.Views.View.ViewAttachedToWindowEventArgs e)
        {
            InitAllViewEvent();
        }
        internal override void InitAllViewEvent()
        {
            base.InitAllViewEvent();
            currentAndroidEditText.TextChanged += CurrentAndroidEditText_TextChanged;
            currentAndroidEditText.FocusChange += CurrentAndroidEditText_FocusChange;
            //currentAndroidEditText.EditorAction += CurrentAndroidEditText_EditorAction;
        }
        internal override void ClearAllViewEvent()
        {
            base.ClearAllViewEvent();
            currentAndroidEditText.TextChanged -= CurrentAndroidEditText_TextChanged;
            currentAndroidEditText.FocusChange -= CurrentAndroidEditText_FocusChange;
            //currentAndroidEditText.EditorAction -= CurrentAndroidEditText_EditorAction;
        }
        public bool Foucs
        {
            get
            {
                return currentAndroidEditText.IsFocused;
            }
            set
            {
                currentAndroidEditText.Focusable = value;
                currentAndroidEditText.RequestFocus();
                currentAndroidEditText.FocusableInTouchMode = value;
                currentAndroidEditText.RequestFocusFromTouch();
                if (value) {
                    var imm = (InputMethodManager)Application.Activity.GetSystemService(Context.InputMethodService);
                    imm.ShowSoftInput(AndroidView, ShowFlags.Forced);
                }
            }
        }
        public Action<View> EditorEnterAction;
        /// <summary>
        /// æ–‡å­—大小
        /// </summary>
        /// <value>The size of the text.</value>
        public float TextSize
        {
            get
            {
                return currentAndroidEditText.TextSize;
            }
            set
            {
                currentAndroidEditText.SetTextSize(ComplexUnitType.Sp, value);
            }
        }
        /// <summary>
        /// æ–‡æœ¬
        /// </summary>
        /// <value>The text.</value>
        public string Text
        {
            get
            {
                return currentAndroidEditText.Text;
            }
            set
            {
                if (value == null)
                    currentAndroidEditText.Text = "";
                else
                    currentAndroidEditText.Text = value.TrimEnd('\0');
            }
        }
        int textID;
        /// <summary>
        /// æ ¹æ®ID获取对应的备注
        /// </summary>
        /// <value>The text I.</value>
        public int TextID
        {
            get
            {
                return textID;
            }
            set
            {
                textID = value;
                Text = Language.StringByID(TextID);
            }
        }
        int _MaxLength = 1000;
        public int MaxLength
        {
            get
            {
                return _MaxLength;
            }
            set
            {
                _MaxLength = value;
            }
        }
        /// <summary>
        /// æ˜¯å¦ä½¿èƒ½
        /// </summary>
        /// <value>true</value>
        /// <c>false</c>
        public override bool Enable
        {
            get
            {
                return currentAndroidEditText.Enabled;
            }
            set
            {
                currentAndroidEditText.Enabled = value;
            }
        }
        /// <summary>
        /// æ˜¾ç¤ºæç¤ºä¿¡æ¯
        /// </summary>
        /// <value>The placeholder.</value>
        public string PlaceholderText
        {
            get
            {
                return currentAndroidEditText.Hint;
            }
            set
            {
                currentAndroidEditText.Hint = value;
            }
        }
        uint placeholderTextColor;
        /// <summary>
        /// Gets or sets the color of the placeholder text.
        /// </summary>
        /// <value>The color of the placeholder text.</value>
        public uint PlaceholderTextColor
        {
            get
            {
                return placeholderTextColor;
            }
            set
            {
                placeholderTextColor = value;
                byte r, g, b, a;
                r = (byte)(placeholderTextColor / 256 / 256 % 256);
                g = (byte)(placeholderTextColor / 256 % 256);
                b = (byte)(placeholderTextColor % 256);
                a = (byte)(placeholderTextColor / 256 / 256 / 256 % 256);
                currentAndroidEditText.SetHintTextColor(Android.Graphics.Color.Argb(a, r, g, b));
            }
        }
        /// <summary>
        /// æ˜¯å¦ç”¨*号隐藏字符
        /// </summary>
        /// <value>The secure text entry.</value>
        public bool SecureTextEntry
        {
            get
            {
                return currentAndroidEditText.InputType != InputTypes.TextVariationVisiblePassword;
            }
            set
            {
                if (value)
                {
                    currentAndroidEditText.InputType = InputTypes.ClassText | InputTypes.TextVariationPassword;
                }
                else
                {
                    currentAndroidEditText.InputType =  InputTypes.TextVariationVisiblePassword;
                }
            }
        }
        bool isSelected;
        /// <summary>
        /// Gets or sets a value indicating whether this instance is selected.
        /// </summary>
        /// <value><c>true</c> if this instance is selected; otherwise, <c>false</c>.</value>
        public bool IsSelected
        {
            get
            {
                return isSelected;
            }
            set
            {
                isSelected = value;
                if (!IsCanRefresh) {
                    return;
                }
                if (isSelected)
                {
                    if (SelectedImagePath == null)
                    {
                        SelectedBackgroundColor = SelectedBackgroundColor;
                    }
                    else
                    {
                        if (!Background(SelectedImagePath))
                        {
                            BackgroundColor = BackgroundColor;
                        }
                    }
                }
                else
                {
                    if (UnSelectedImagePath == null)
                    {
                        BackgroundColor = BackgroundColor;
                    }
                    else
                    {
                        if (!Background(UnSelectedImagePath))
                        {
                            BackgroundColor = BackgroundColor;
                        }
                    }
                }
            }
        }
        uint selectedBackgroundColor;
        /// <summary>
        /// é€‰æ‹©æ—¶èƒŒæ™¯é¢œè‰²
        /// </summary>
        /// <value>The color of the text.</value>
        public uint SelectedBackgroundColor
        {
            get
            {
                return selectedBackgroundColor;
            }
            set
            {
                selectedBackgroundColor = value;
                if (AndroidView.Background == null || AndroidView.Background.GetType() != typeof(GradientDrawable))
                {
                    AndroidView.Background = new Android.Graphics.Drawables.GradientDrawable();
                }
                var gradientDrawable = (GradientDrawable)AndroidView.Background;
                gradientDrawable.SetCornerRadius(DensityUtil.Dip2Px(Radius));
                byte r, g, b, a;
                r = (byte)(BorderColor / 256 / 256 % 256);
                g = (byte)(BorderColor / 256 % 256);
                b = (byte)(BorderColor % 256);
                a = (byte)(BorderColor / 256 / 256 / 256 % 256);
                gradientDrawable.SetStroke((int)BorderWidth, Android.Graphics.Color.Argb(a, r, g, b));
                r = (byte)(selectedBackgroundColor / 256 / 256 % 256);
                g = (byte)(selectedBackgroundColor / 256 % 256);
                b = (byte)(selectedBackgroundColor % 256);
                a = (byte)(selectedBackgroundColor / 256 / 256 / 256 % 256);
                gradientDrawable.SetColor(Android.Graphics.Color.Argb(a, r, g, b).ToArgb());
            }
        }
        /// <summary>
        /// åˆ·æ–°å¤§å°
        /// </summary>
        public override void Refresh()
        {
            base.Refresh();
            IsSelected = isSelected;
        }
        uint textColor;
        /// <summary>
        /// æ–‡å­—颜色
        /// </summary>
        /// <value>The color of the text.</value>
        public uint TextColor
        {
            get
            {
                return textColor;
            }
            set
            {
                textColor = value;
                byte r, g, b, a;
                r = (byte)(textColor / 256 / 256 % 256);
                g = (byte)(textColor / 256 % 256);
                b = (byte)(textColor % 256);
                a = (byte)(textColor / 256 / 256 / 256 % 256);
                currentAndroidEditText.SetTextColor(Android.Graphics.Color.Argb(a, r, g, b));
            }
        }
        public static int FocusBottom{
            get{
                return AndroidEditText.Bottom;
            }
        }
        //大家新年好!编译人生代码,运行幸福程序;升级应用功能,超出项目需求。2019年,你的幸福数据在加载中。。。。。
        TextAlignment textAlignment = TextAlignment.Center;
        /// <summary>
        /// Texts the alignment.
        /// </summary>
        /// <param name="horizontalAlignment">Horizontal alignment.</param>
        /// <param name="verticalAlignment">Vertical alignment.</param>
        public TextAlignment TextAlignment
        {
            get
            {
                return textAlignment;
            }
            set
            {
                textAlignment = value;
                switch (value)
                {
                    case TextAlignment.TopLeft:
                        currentAndroidEditText.Gravity = GravityFlags.Top | GravityFlags.Left;
                        break;
                    case TextAlignment.TopCenter:
                        currentAndroidEditText.Gravity = GravityFlags.Top | GravityFlags.Center;
                        break;
                    case TextAlignment.TopRight:
                        currentAndroidEditText.Gravity = GravityFlags.Top | GravityFlags.Right;
                        break;
                    case TextAlignment.CenterLeft:
                        currentAndroidEditText.Gravity = GravityFlags.Center | GravityFlags.Left;
                        break;
                    case TextAlignment.Center:
                        currentAndroidEditText.Gravity = GravityFlags.Center | GravityFlags.Center;
                        break;
                    case TextAlignment.CenterRight:
                        currentAndroidEditText.Gravity = GravityFlags.Center | GravityFlags.Right;
                        break;
                    case TextAlignment.BottomLeft:
                        currentAndroidEditText.Gravity = GravityFlags.Bottom | GravityFlags.Left;
                        break;
                    case TextAlignment.BottomCenter:
                        currentAndroidEditText.Gravity = GravityFlags.Bottom | GravityFlags.Center;
                        break;
                    case TextAlignment.BottomRight:
                        currentAndroidEditText.Gravity = GravityFlags.Bottom | GravityFlags.Right;
                        break;
                }
            }
        }
        /// <summary>
        /// é€‰æ‹©æ—¶èƒŒæ™¯å›¾è·¯å¾„
        /// </summary>
        /// <value>The selected image path.</value>
        public string SelectedImagePath { get; set; }
        /// <summary>
        /// éžé€‰ä¸­çŠ¶æ€çš„èƒŒæ™¯å›¾è·¯å¾„
        /// </summary>
        /// <value>The un selected image path.</value>
        public string UnSelectedImagePath { get; set; }
        /// <summary>
        /// è¾“入文字变化事件
        /// </summary>
        public Action<View, string> TextChangeEventHandler;
        public void SetSingleLine(bool bSingle, int maxLines = 0)
        {
            currentAndroidEditText.SetSingleLine(bSingle);
            if (!bSingle) {
                currentAndroidEditText.SetMaxLines(maxLines);
            }
        }
        /// <summary>
        /// åˆ·æ–°placeholderUILabel布局
        /// </summary>
        public void InitIosPlaceholderUILabelWithHeight(int mHeight)
        {
        }
        public void HideSoftInput()
        {
            var imm = (Android.Views.InputMethods.InputMethodManager)Application.Activity.GetSystemService(Context.InputMethodService);
            if (Shared.EditTextView.Instance != null)
            {
                imm.HideSoftInputFromWindow(Shared.EditTextView.Instance.AndroidView.WindowToken, 0); //强制隐藏键盘
            }
            else
            {
                imm.ToggleSoftInput(0, Android.Views.InputMethods.HideSoftInputFlags.NotAlways);
            }
        }
        class AndroidEditText : Android.Widget.EditText
        {
            EditTextView editText;
            public AndroidEditText(Context context, EditTextView editText)
                : base(context)
            {
                SetTextColor(Android.Graphics.Color.White);
                SetPadding(10, 10, 10, 10);
                TextAlignment = Android.Views.TextAlignment.Center;
                Gravity = GravityFlags.Top | GravityFlags.Left;
                SetSingleLine(false);
                SetMaxLines(20);
                this.editText = editText;
            }
            protected override void OnFocusChanged (bool gainFocus, [GeneratedEnum] FocusSearchDirection direction, Rect previouslyFocusedRect)
            {
                base.OnFocusChanged (gainFocus, direction, previouslyFocusedRect);
                var location = new int[2];
                this.GetLocationOnScreen(location);
                if (gainFocus) {
                    Bottom = location [1] + this.Height;
                }
                else{
                    Bottom = 0;
                }
            }
            //public override bool OnKeyDown([GeneratedEnum] Keycode keyCode, KeyEvent e)
            //{
            //    if (e != null && e.KeyCode == Keycode.Del && e.Action == KeyEventActions.Down)
            //    {
            //        editText?.KeyEventAction?.Invoke(editText,"Del");
            //    }
            //    return base.OnKeyDown(keyCode, e);
            //}
            public static int Bottom;
        }
    }
}
ZigbeeApp/Shared.Droid/UI/Enum.cs
New file
@@ -0,0 +1,78 @@

namespace Shared
{
    public static class LayoutParams
    {
        public static readonly int MatchParent=int.MinValue;
    }
    public enum Color
    {
        Red=0xFF0000,
        Green=0x00FF00,
        Blue=0x0000FF
    }
    public enum Animate
    {
        None,
        UpToDown,
        DownToUp,
        LeftToRight,
        RightToLeft,
        Rotation
    }
    public enum AMPopTipDirection
    {
        Up,
        Down,
        Left,
        Right,
        None
    }
    public enum Device
    {
        Android,
        Ios,
        Phone
    }
    public enum Gravity
    {
        TopLeft,
        TopCenter,
        TopRight,
        CenterLeft,
        Center,
        CenterRight,
        BottomLeft,
        BottomCenter,
        BottomRight,
        CenterVertical,
        CenterHorizontal,
        Frame
    }
    public enum TextAlignment
    {
        TopLeft,
        TopCenter,
        TopRight,
        CenterLeft,
        Center,
        CenterRight,
        BottomLeft,
        BottomCenter,
        BottomRight,
    }
}
ZigbeeApp/Shared.Droid/UI/FrameLayout.cs
New file
@@ -0,0 +1,90 @@
using System;
using Android.Views;
using Android.Content;
using Android.Util;
using Android.Runtime;
namespace Shared
{
    //已经全面检查了代码
    /// <summary>
    /// ç»å¯¹å¸ƒå±€
    /// </summary>
    public class FrameLayout : ViewGroup
    {
        /// <summary>
        /// å½“前视图
        /// </summary>
        public FrameLayout ()
        {
            viewGroup = new AndroidFrameLayout (Application.Activity, this);
            realViewGroup = viewGroup;
        }
        /// <summary>
        /// ä»¥ä¼ è¿›æ¥çš„对象为当前对象
        /// </summary>
        /// <param name="frameLayout">Frame layout.</param>
        internal FrameLayout (Android.Widget.FrameLayout frameLayout)
        {
            viewGroup = frameLayout;
            realViewGroup = viewGroup;
        }
    }
    //已经全面检查了代码
    /// <summary>
    /// Android原生绝对布局视图 FrameLayout
    /// </summary>
    class AndroidFrameLayout : Android.Widget.FrameLayout
    {
        View _view;
        public AndroidFrameLayout(Context context,View view)
            : base(context)
        {
            _view = view;
        }
        public override bool OnTouchEvent(MotionEvent e)
        {
            base.OnTouchEvent(e);
            _view?.TouchEvent(e);
            return true;
        }
        bool disallowIntercept;
        public override void RequestDisallowInterceptTouchEvent(bool disallowIntercept)
        {
            this.disallowIntercept = disallowIntercept;
            //System.Console.WriteLine($"{GetType()} Height->{Height} RequestDisallowInterceptTouchEvent->{disallowIntercept}");
            base.RequestDisallowInterceptTouchEvent(disallowIntercept);
            Parent?.RequestDisallowInterceptTouchEvent(disallowIntercept);
        }
    }
    //已经全面检查了代码
    /// <summary>
    ///  å·²ç»å…¨é¢æ£€æŸ¥ä»£ç 
    /// </summary>
    class AndroidLinearLayout : Android.Widget.LinearLayout
    {
        View _view;
        public AndroidLinearLayout (Context context, View view)
            : base (context)
        {
            _view = view;
        }
        public override bool OnTouchEvent(MotionEvent e)
        {
            base.OnTouchEvent(e);
            _view?.TouchEvent(e);
            return true;
        }
        bool disallowIntercept;
        public override void RequestDisallowInterceptTouchEvent(bool disallowIntercept)
        {
            this.disallowIntercept = disallowIntercept;
            System.Console.WriteLine($"{GetType()} Height->{Height} RequestDisallowInterceptTouchEvent->{disallowIntercept}");
            base.RequestDisallowInterceptTouchEvent(disallowIntercept);
            Parent?.RequestDisallowInterceptTouchEvent(disallowIntercept);
        }
    }
}
ZigbeeApp/Shared.Droid/UI/GDMapView.cs
New file
@@ -0,0 +1,56 @@
using System;
using System.Collections.Generic;
using Android.Content;
using Com.Hdl.Widget.Gdmapkit;
namespace Shared
{
    public class GDMapKit
    {
        public static void Show(Action<double, double, int, string> action, string titleName = "", bool bSetHome = false, double mLatitude = 0.0, double mLongitude = 0.0, int mRadius = 500) {
            //GDConst.GetAppSHA1(Application.Activity);
            if (bSetHome && (mLatitude != 0.0) && (mLongitude != 0.0))
            {
                GDConst.BMyHomeSet = true;
                GDConst.MyHomeLatitude = mLatitude;
                GDConst.MyHomeLongitude = mLongitude;
                GDConst.MyHomeRadiusRange = mRadius;
            }
            else
            {
                GDConst.BMyHomeSet = false;
            }
            GDConst.MyTitleName = titleName;
            GDGeoFenceRoundActivity.MOnGeofenceCallback = new OnGeofenceCallback(action);
            Application.Activity.StartActivity(new Intent(Application.Activity, typeof(GDGeoFenceRoundActivity)));
        }
        /// <summary>
        /// OnGeofenceCallback
        /// </summary>
        public class OnGeofenceCallback : Java.Lang.Object, IOnGeofenceCallback
        {
            Action<double, double, int, string> mAction;
            public OnGeofenceCallback(Action<double, double, int, string> action)
            {
                mAction = action;
            }
            public void OnSaveCallback(double mLatitude, double mLongitude, float mRadius, string addressName)
            {
                mAction?.Invoke(mLatitude, mLongitude, (int)mRadius, addressName);
            }
        }
    }
}
ZigbeeApp/Shared.Droid/UI/GestureLockView.cs
New file
@@ -0,0 +1,152 @@
using System;
//using static Com.Hdl.Widget.Gesturelock.GestureLockView;
namespace Shared
{
    /// <summary>
    /// GestureLockView
    /// </summary>
    public class GestureLockView : View
    {
        /// <summary>
        ///  å½“前视图
        /// </summary>
        /// <value>The GestureLockView.</value>
        Com.Hdl.Widget.Gesturelock.GestureLockView mHDLGestureLockView
        {
            get
            {
                return AndroidView as Com.Hdl.Widget.Gesturelock.GestureLockView;
            }
            set
            {
                AndroidView = value;
            }
        }
        /// <summary>
        /// æž„造函数
        /// </summary>
        public GestureLockView()
        {
            mHDLGestureLockView = new Com.Hdl.Widget.Gesturelock.GestureLockView(Application.Activity);
            //mHDLGestureLockView.ResetGesture();
            mOnLockVerifyListener = new OnLockVerifyListener(this);
            mHDLGestureLockView.SetOnLockVerifyListener(mOnLockVerifyListener);
            //mHDLGestureLockView.Measure
            //mHDLGestureLockView.
        }
        public void setinvalidate()
        {
            mHDLGestureLockView.Invalidate();
        }
        /// <summary>
        /// è®¾ç½®æ­£ç¡®å’Œæ™®é€šæ—¶çš„颜色
        /// </summary>
        /// <value>线颜色</value>
        public uint LockViewCorrectColor
        {
            set
            {
                byte r, g, b, a;
                r = (byte)(value / 256 / 256 % 256);
                g = (byte)(value / 256 % 256);
                b = (byte)(value % 256);
                a = (byte)(value / 256 / 256 / 256 % 256);
                mHDLGestureLockView.SetMatchedPathColor(Android.Graphics.Color.Argb(a, r, g, b));
                mHDLGestureLockView.SetTouchedPathColor(Android.Graphics.Color.Argb(a, r, g, b));
            }
        }
        /// <summary>
        /// è®¾ç½®é”™è¯¯æ—¶çš„颜色
        /// </summary>
        /// <value>线颜色</value>
        public uint LockViewErrorColor
        {
            set
            {
                byte r, g, b, a;
                r = (byte)(value / 256 / 256 % 256);
                g = (byte)(value / 256 % 256);
                b = (byte)(value % 256);
                a = (byte)(value / 256 / 256 / 256 % 256);
                mHDLGestureLockView.SetUnmatchedPathColor(Android.Graphics.Color.Argb(a, r, g, b));
            }
        }
        /// <summary>
        /// æ˜¾ç¤ºæ‰‹åŠ¿è§£é”view æ˜¯å¦æ˜¾ç¤ºæ­£ç¡®
        /// </summary>
        public void showCorrectStatus(bool isTrue)
        {
            if (isTrue)
            {
                mHDLGestureLockView.SetLockViewMatchedState(Java.Lang.Boolean.True);
            }
            else
            {
                mHDLGestureLockView.SetLockViewMatchedState(Java.Lang.Boolean.False);
            }
        }
        /// <summary>
        /// Action
        /// </summary>
        public Action<string, int> OnLockVerifyEvent;
        /// <summary>
        /// OnProgressChangeListener ç»§æ‰¿å“åº”事件
        /// </summary>
        OnLockVerifyListener mOnLockVerifyListener;
        public class OnLockVerifyListener : Java.Lang.Object, Com.Hdl.Widget.Gesturelock.GestureLockView.IOnLockVerifyListener
        {
            GestureLockView _GestureLockView;
            public OnLockVerifyListener(GestureLockView view)
            {
                _GestureLockView = view;
            }
            public void OnGestureFinished(string selectNumStr, int selectCount)
            {
                _GestureLockView.OnLockVerifyEvent?.Invoke(selectNumStr, selectCount);
            }
            public void OnGestureSelected(int p0)
            {
            }
        }
    }
}
ZigbeeApp/Shared.Droid/UI/HorizontalPages.cs
New file
@@ -0,0 +1,530 @@
using System;
using Android.Views;
using Android.Content;
using Android.Widget;
using Android.Graphics.Drawables;
namespace Shared
{
    //已经全面检查了代码
    /// <summary>
    /// ä½ç½®å¸ƒå±€
    /// </summary>
    public class HorizontalPages : ViewGroup
    {
        /// <summary>
        /// è§†å›¾é«˜åº¦
        /// </summary>
        /// <value>The height.</value>
        public override int Height
        {
            get
            {
                return base.Height;
            }
            set
            {
                base.Height = value;
                if (!IsCanRefresh)
                {
                    return;
                }
                var layoutParameters = realViewGroup.LayoutParameters;
                layoutParameters.Height = Height;
                realViewGroup.LayoutParameters = layoutParameters;
            }
        }
        /// <summary>
        /// è§†å›¾å®½åº¦
        /// </summary>
        /// <value>The width.</value>
        public override int Width
        {
            get
            {
                return base.Width;
            }
            set
            {
                base.Width = value;
                if (!IsCanRefresh)
                {
                    return;
                }
                var layoutParameters = realViewGroup.LayoutParameters;
                layoutParameters.Width = Width;
                realViewGroup.LayoutParameters = layoutParameters;
            }
        }
        /// <summary>
        /// é¡µé¢å˜åŒ–事件
        /// </summary>
        public Action<HorizontalPages, int> PageChange;
        /// <summary>
        /// æž„造函数
        /// </summary>
        public HorizontalPages()
        {
            viewGroup = new AndroidFrameLayout(Application.Activity, null);
            realViewGroup = new InnerHorizontalPages(Application.Activity, this) { };
            viewGroup.AddView(realViewGroup);
        }
        int pageIndex;
        /// <summary>
        /// è®¾ç½®æˆ–者获取当前的界面索引
        /// </summary>
        /// <value>The index of the page.</value>
        public int PageIndex
        {
            get
            {
                return (realViewGroup as InnerHorizontalPages).CurrentScreen;
            }
            set
            {
                if (value < 0 || ChildrenCount < value)
                {
                    return;
                }
                pageIndex = value;
                if (!IsCanRefresh)
                {
                    return;
                }
                (realViewGroup as InnerHorizontalPages).SetSelection(value);
            }
        }
        /// <summary>
        /// æ˜¯å¦å…è®¸æ»‘动
        /// </summary>
        /// <value><c>true</c> if scroll enabled; otherwise, <c>false</c>.</value>
        public bool ScrollEnabled
        {
            get
            {
                return (realViewGroup as InnerHorizontalPages).ScrollEnabled;
            }
            set
            {
                (realViewGroup as InnerHorizontalPages).ScrollEnabled = value;
            }
        }
        /// <summary>
        /// å¢žåŠ å­æŽ§ä»¶
        /// </summary>
        /// <param name="view">View.</param>
        public override void AddChidren(View view)
        {
            view.Parent = this;
            viewList.Add(view);
            realViewGroup.AddView(view.AndroidView);
            if (!IsCanRefresh)
            {
                return;
            }
            view.Refresh();
            if (view is ViewGroup)
            {
                var tempViewGroup = (ViewGroup)view;
                for (int i = 0; i < tempViewGroup.ChildrenCount; i++)
                {
                    tempViewGroup.GetChildren(i).Refresh();
                }
            }
        }
        /// <summary>
        /// ç§»é™¤å½“前控件
        /// </summary>
        /// <param name="view">View.</param>
        internal override void Remove(View view)
        {
            if (view == null)
            {
                return;
            }
            var index = viewList.FindIndex(obj => obj == view);
            if (index < 0)
            {
                return;
            }
            viewList.Remove(view);
            (realViewGroup as InnerHorizontalPages).RemoveViewAt(index);
            view.Parent = null;
        }
        /// <summary>
        /// ç§»é™¤æ‰€æœ‰çš„æŽ§ä»¶
        /// </summary>
        public override void RemoveAll()
        {
            while (0 < viewList.Count)
            {
                GetChildren(0)?.RemoveFromParent();
            }
            (realViewGroup as InnerHorizontalPages).SetSelection(0);
        }
        /// <summary>
        /// æ ¹æ®ç´¢å¼•移除控件
        /// </summary>
        /// <param name="index">Index.</param>
        public override void RemoveAt(int index)
        {
            if (viewList.Count - 1 < index || index < 0)
            {
                return;
            }
            GetChildren(index)?.RemoveFromParent();
        }
        /// <summary>
        /// page的外边距
        /// </summary>
        public int RowPadding
        {
             get
            {
                return (realViewGroup as InnerHorizontalPages).Padding;
            }
            set
            {
                (realViewGroup as InnerHorizontalPages).Padding = value;
            }
        }
        /// <summary>
        /// ä¸¤ä¸ªPage之间的距离
        /// </summary>
        public int PagePadding
        {
            get
            {
                return (realViewGroup as InnerHorizontalPages).Padding - (realViewGroup as InnerHorizontalPages).PagePadding;
            }
            set
            {
                (realViewGroup as InnerHorizontalPages).PagePadding = (realViewGroup as InnerHorizontalPages).Padding - value;
            }
        }
    }
    public class InnerHorizontalPages : Android.Widget.FrameLayout
    {
        public bool ScrollEnabled = true;
        static int snapVelocity = 1000;
        static int invalidScreen = -1;
        static int touchStateRest = 0;
        static int touchStateScrolling = 1;
        /// <summary>
        /// ç•Œé¢ä¹‹é—´çš„边距
        /// </summary>
        public int Padding = 100;
        public int PagePadding = 50;
        Scroller scroller;
        VelocityTracker mVelocityTracker = VelocityTracker.Obtain();
        int touchState = touchStateRest;
        float lastMotionX;
        float lastMotionY;
        int mTouchSlop;
        int mMaximumVelocity;
        internal int CurrentScreen;
        public override void RemoveViewAt(int index)
        {
            if (index == ChildCount - 1) {
                CurrentScreen--;
                if (CurrentScreen < 0) {
                    CurrentScreen = 0;
                }
            }
            base.RemoveViewAt(index);
            //刷新
            snapToDestination();
        }
        Shared.HorizontalPages horizontalPages;
        public InnerHorizontalPages(Context context, Shared.HorizontalPages view) : base(context)
        {
            horizontalPages = view;
            init();
        }
        /// <summary>
        /// é‡å†™è¿™ä¸ªæ˜¯ä¸ºäº†æ–¹ä¾¿éƒ¨å±€ï¼Œåœ¨æ¯ä¸ªç•Œé¢ä¹‹é—´éƒ½å¤šåŠ äº†ä¸€ä¸ªæŽ§ä»¶åŒ…ä½
        /// </summary>
        /// <param name="child"></param>
        public override void AddView(Android.Views.View child)
        {
            var innerView = new Android.Widget.FrameLayout(Shared.Application.Activity);
            innerView.SetPadding(Padding, 0, Padding, 0);
            if (1 <= ChildCount)
            {
                innerView.SetX(LayoutParameters.Width * ChildCount - Padding - PagePadding);
            }
            base.AddView(innerView, new Android.Widget.FrameLayout.LayoutParams(LayoutParameters.Width, LayoutParameters.Height) { });
            innerView.AddView(child);
        }
        void init()
        {
            scroller = new Scroller(Context);
            var configuration = ViewConfiguration.Get(Context);
            //最小的滑动距离
            mTouchSlop = configuration.ScaledTouchSlop;
            mMaximumVelocity = configuration.ScaledMaximumFlingVelocity;
        }
        public override void RequestDisallowInterceptTouchEvent(bool disallowIntercept)
        {
            base.RequestDisallowInterceptTouchEvent(disallowIntercept);
            disallowInterceptTouchEvent = disallowIntercept;
        }
        bool disallowInterceptTouchEvent;
        bool isFirst;
        public override bool OnInterceptTouchEvent(MotionEvent ev)
        {
            if (disallowInterceptTouchEvent)
            {
                return false;
            }
            System.Console.WriteLine($"PageLayout->OnInterceptTouchEvent:{Height}   {ev.Action}");
            //如果没有子控件或者不允许滑动就返回,不处理当前事件
            if (ChildCount == 0 || !ScrollEnabled)
                return false;
            mVelocityTracker.AddMovement(ev);
            var x = ev.GetX();
            var y = ev.GetY();
            switch (ev.Action)
            {
                //每次点击都执行这里
                case MotionEventActions.Down:
                    if (!scroller.IsFinished)
                    {
                        //如果还在滑动,但是用户重新点击了,就让控件马上停止
                        scroller.AbortAnimation();
                        snapToDestination(false);
                    }
                    //记录点击的最新X坐标
                    lastMotionX = x;
                    lastMotionY = y;
                    touchState = scroller.IsFinished ? touchStateRest : touchStateScrolling;
                    break;
                //有子控件时执行这里
                case MotionEventActions.Move:
                    var deltaX = (int)(lastMotionX - x);
                    var deltaY = (int)(lastMotionY - y);
                    //当前滑动是否已经超出了设定值
                    var xMoved = Math.Abs(deltaX) > mTouchSlop;
                    System.Console.WriteLine($"PageLayout->xMoved22:{xMoved }   {deltaX}");
                    if (xMoved && Math.Abs(deltaY) < Math.Abs(deltaX))
                    {
                        if (!isFirst)
                        {
                            touchState = touchStateScrolling;
                        }
                        isFirst = false;
                        System.Console.WriteLine($"PageLayout->xMoved33:{xMoved }   {deltaX}");
                    }
                    if (touchState == touchStateScrolling)
                    {
                        //记录最新的坐标,因为接下来控件已经滑动了
                        lastMotionX = x;
                        System.Console.WriteLine($"PageLayout->lastMotionX:{lastMotionX }   {touchState}");
                        //当前事件自己处理了,子控制不需要处理当前这事件
                        return true;
                    }
                    break;
                case MotionEventActions.Cancel:
                    touchState = touchStateRest;
                    mVelocityTracker.Clear();
                    break;
            }
            return false;
        }
        public override bool OnTouchEvent(MotionEvent e)
        {
            if (disallowInterceptTouchEvent)
            {
                return false;
            }
            System.Console.WriteLine($"PageLayout->OnTouchEvent:{Height}   {e.Action}");
            if (ChildCount == 0 || !ScrollEnabled)
                return false;
            mVelocityTracker.AddMovement(e);
            var x = e.GetX();
            var y = e.GetY();
            switch (e.Action)
            {
                case MotionEventActions.Move:
                    var deltaX = (int)(lastMotionX - x);
                    var deltaY = (int)(lastMotionY - y);
                    //当前滑动是否已经超出了设定值
                    var xMoved = Math.Abs(deltaX) > mTouchSlop;
                    System.Console.WriteLine($"PageLayout->xMoved:{xMoved }   {deltaX}");
                    if (xMoved && Math.Abs(deltaY) < Math.Abs(deltaX))
                    {
                        if (!isFirst)
                        {
                            touchState = touchStateScrolling;
                        }
                        isFirst = false;
                    }
                    if (touchState == touchStateScrolling)
                    {
                        lastMotionX = x;
                        return true;
                    }
                    break;
                case MotionEventActions.Up:
                    if (touchState == touchStateScrolling)
                    {
                        mVelocityTracker.ComputeCurrentVelocity(1000, mMaximumVelocity);
                        var velocityX = mVelocityTracker.XVelocity;
                        if (velocityX > snapVelocity && CurrentScreen > 0)
                        {
                            // æ˜¾ç¤ºå·¦è¾¹ç•Œé¢
                            snapToScreen(CurrentScreen - 1);
                        }
                        else if (velocityX < -snapVelocity && CurrentScreen < ChildCount - 1)
                        {
                            // æ˜¾ç¤ºå³è¾¹ç•Œé¢
                            snapToScreen(CurrentScreen + 1);
                        }
                    }
                    touchState = touchStateRest;
                    mVelocityTracker.Clear();
                    break;
                case MotionEventActions.Cancel:
                    touchState = touchStateRest;
                    mVelocityTracker.Clear();
                    break;
            }
            return true;
        }
        /// <summary>
        /// æ»‘动到指定的界面
        /// </summary>
        void snapToDestination(bool isDelay = true)
        {
            var whichScreen = (ScrollX + (MeasuredWidth / 2)) / MeasuredWidth;
            snapToScreen(whichScreen, isDelay);
        }
        /// <summary>
        /// æ»‘动到指定界面
        /// </summary>
        /// <param name="whichScreen">Which screen.</param>
        void snapToScreen(int whichScreen, bool isDelay = true)
        {
            if (!scroller.IsFinished)
            {
                scroller.AbortAnimation();
            }
            var beforePosition = CurrentScreen;
            whichScreen = Math.Max(0, Math.Min(whichScreen, ChildCount - 1));
            CurrentScreen = whichScreen;
            //还原这个控件之前的位置
            var newX = CurrentScreen * MeasuredWidth;
            var delta = newX - ScrollX;
            scroller.StartScroll(ScrollX, 0, delta, 0, isDelay ? 800 : 0);
            Invalidate();
            refreshPage();
            if (beforePosition != CurrentScreen)
            {
                horizontalPages.PageChange?.Invoke(horizontalPages, CurrentScreen);
            }
        }
        void refreshPage()
        {
            GetChildAt(CurrentScreen).SetX(LayoutParameters.Width * CurrentScreen);
            if (0 <= CurrentScreen - 1)
            {
                //让上一个界面向右出来一点
                GetChildAt(CurrentScreen - 1).SetX(LayoutParameters.Width * (CurrentScreen - 1) + Padding + PagePadding);
            }
            if (CurrentScreen + 1 <= ChildCount - 1)
            {
                //让下一个界面向左出来一点
                GetChildAt(CurrentScreen + 1).SetX(LayoutParameters.Width * (CurrentScreen + 1) - Padding - PagePadding);
            }
        }
        public override void ComputeScroll()
        {
            if (scroller.ComputeScrollOffset())
            {
                ScrollTo(scroller.CurrX, scroller.CurrY);
                PostInvalidate();
            }
            else if (CurrentScreen != invalidScreen)
            {
                //mCurrentScreen = Math.Max(0, Math.Min(mNextScreen, ChildCount - 1));
                //mNextScreen = invalidScreen;
                //postViewSwitched(mLastScrollDirection);
            }
        }
        public void SetSelection(int position)
        {
            if (position < 0)
            {
                return;
            }
            scroller.ForceFinished(true);
            position = Math.Min(position, ChildCount - 1);
            snapToScreen(position, false);
        }
        public override bool DispatchTouchEvent(MotionEvent e)
        {
            //System.Console.WriteLine($"PageLayout->DispatchTouchEvent:{Height}   {e.Action}");
            if (e.Action == MotionEventActions.Down)
            {
                //还原中断
                RequestDisallowInterceptTouchEvent(false);
                isFirst = true;
            }
            return base.DispatchTouchEvent(e);
        }
    }
}
ZigbeeApp/Shared.Droid/UI/HorizontalScrolViewLayout.cs
New file
@@ -0,0 +1,214 @@
using System;
using Android.Widget;
using Android.Views;
using Android.Content;
using Android.Util;
using Android.Runtime;
namespace Shared
{
    //已经全面检查了代码
    /// <summary>
    /// ä½ç½®å¸ƒå±€
    /// </summary>
    public  class HorizontalScrolViewLayout:ViewGroup
    {
        /// <summary>
        /// æž„造函数
        /// </summary>
        public HorizontalScrolViewLayout()
        {
            viewGroup = new AndroidHorizontalScrollView(Application.Activity,this);
            realViewGroup = new AndroidLinearLayout(Application.Activity,this);
            (realViewGroup as AndroidLinearLayout).Orientation = Orientation.Horizontal;
            viewGroup.AddView(realViewGroup);
        }
        /// <summary>
        /// è§†å›¾å®½åº¦
        /// </summary>
        /// <value>The width.</value>
        public override int Width
        {
            get
            {
                return base.Width;
            }
            set
            {
                base.Width = value;
                if (!IsCanRefresh)
                {
                    return;
                }
                realViewGroup.LayoutParameters.Width = Width;
            }
        }
        /// <summary>
        /// è§†å›¾é«˜åº¦
        /// </summary>
        /// <value>The height.</value>
        public override int Height
        {
            get
            {
                return base.Height;
            }
            set
            {
                base.Height = value;
                if (!IsCanRefresh)
                {
                    return;
                }
                realViewGroup.LayoutParameters.Height = Height;
            }
        }
        /// <summary>
        /// æ˜¯å¦å…è®¸æ»‘动
        /// </summary>
        /// <value><c>true</c> if scroll enabled; otherwise, <c>false</c>.</value>
        public bool ScrollEnabled
        {
            get
            {
                return (viewGroup as AndroidHorizontalScrollView).ScrollEnabled;
            }
            set
            {
                (viewGroup as AndroidHorizontalScrollView).ScrollEnabled = value;
            }
        }
        /// <summary>
        /// æ˜¯å¦æ­£åœ¨æ»‘动
        /// </summary>
        /// <value><c>true</c> if decelerating; otherwise, <c>false</c>.</value>
        public bool Decelerating
        {
            get
            {
                return false;
            }
        }
    }
    /// <summary>
    /// Android åŽŸç”Ÿ AndroidHorizontalScrollView
    /// </summary>
    class AndroidHorizontalScrollView: Android.Widget.HorizontalScrollView
    {
        public bool ScrollEnabled=true;
        View _view;
        /// <summary>
        /// æž„造函数
        /// </summary>
        /// <param name="context">Context.</param>
        /// <param name="view">View.</param>
        public AndroidHorizontalScrollView(Context context,View view)
            : base(context) {
            _view = view;
        }
        /// <summary>
        /// é‡å†™ç‚¹å‡»äº‹ä»¶
        /// </summary>
        /// <returns><c>true</c>事件已经处理<c>false</c>事件没有处理</returns>
        /// <param name="e">E.</param>
        public override bool OnTouchEvent(MotionEvent e)
        {
            if (ScrollEnabled)
            {
                base.OnTouchEvent(e);
            }
            _view.TouchEvent( e);
            return true;
        }
        public override bool DispatchTouchEvent(MotionEvent e)
        {
            System.Console.WriteLine($"{GetType()} Height->{Height} Width->{Width} DispatchTouchEvent->{e.Action}");
            if (e.Action == MotionEventActions.Down)
            {
                //还原允许拦截事件
                RequestDisallowInterceptTouchEvent(false);
            }
            return base.DispatchTouchEvent(e);
        }
        float mLastX, mLastY;
        public override bool OnInterceptTouchEvent(MotionEvent ev)
        {
            System.Console.WriteLine($"{GetType()} Height->{Height} Width->{Width} OnInterceptTouchEvent->{ev.Action}");
            if (!Enabled || disallowIntercept)
            {
                return false;
            }
            switch (ev.Action)
            {
                case MotionEventActions.Down:
                    mLastX = ev.RawX;
                    mLastY = ev.RawY;
                    Parent?.RequestDisallowInterceptTouchEvent(true);
                    break;
                case MotionEventActions.Move:
                    var x = ev.RawX;
                    var y = ev.RawY;
                    var deltaX = x - mLastX;
                    var deltaY = y - mLastY;
                    //左右滑动
                    if (Math.Abs(deltaY) < Math.Abs(deltaX))
                    {
                        //向下滑动,如果当前已经滑动到顶,就允许父控件的拦截事件
                        if (deltaX > 0 && ScrollX == 0)
                        {
                            Parent?.RequestDisallowInterceptTouchEvent(false);
                            return false;
                        }
                        //向上滑动时,如果translateY等于高度时,即表明滑动到底部,可又顶层View控制滑动
                        var rightLoaction = 0;
                        if (0 < ChildCount)
                        {
                            rightLoaction = GetChildAt(ChildCount - 1).Right;
                        }
                        var translateX = rightLoaction - ScrollX;
                        if (deltaX < 0 && translateX == Width)
                        {
                            Parent?.RequestDisallowInterceptTouchEvent(false);
                            return false;
                        }
                    }
                    else
                    {
                        //上下滑动时,允许父控件的拦截
                        if (4 < Math.Abs(deltaY))
                        {
                            Parent?.RequestDisallowInterceptTouchEvent(false);
                        }
                    }
                    break;
            }
            return base.OnInterceptTouchEvent(ev);
        }
        bool disallowIntercept;
        public override void RequestDisallowInterceptTouchEvent(bool disallowIntercept)
        {
            this.disallowIntercept = disallowIntercept;
            System.Console.WriteLine($"{GetType()} Height->{Height} RequestDisallowInterceptTouchEvent->{disallowIntercept}");
            base.RequestDisallowInterceptTouchEvent(disallowIntercept);
            Parent?.RequestDisallowInterceptTouchEvent(disallowIntercept);
        }
    }
}
ZigbeeApp/Shared.Droid/UI/HorizontalSeekBar.cs
New file
@@ -0,0 +1,354 @@
using System;
using Android.Views;
using Android.Content;
using Android.Util;
using Android.Runtime;
namespace Shared
{
    //已经全面检查了代码
    /// <summary>
    /// ä½ç½®å¸ƒå±€
    /// </summary>
    public class HorizontalSeekBar : View
    {
        Android.Widget.ImageView backImageView;
        Android.Widget.ImageView progressImageView;
        Android.Widget.Button thumbButton;
        AndroidHorizontalSeekBar androidHorizonetalSeekBar;
        /// <summary>
        /// å½“前实例
        /// </summary>
        public HorizontalSeekBar()
        {
            AndroidView = new AndroidFrameLayout(Application.Activity, null) { };
            //AndroidView.SetBackgroundColor (Android.Graphics.Color.DarkCyan);
            {
                backImageView = new Android.Widget.ImageView(Application.Activity, null) { Enabled=false };
                backImageView.SetBackgroundColor(Android.Graphics.Color.WhiteSmoke);
                (AndroidView as AndroidFrameLayout).AddView(backImageView, new Android.Widget.FrameLayout.LayoutParams(Android.Views.ViewGroup.LayoutParams.MatchParent, Dip2Px(2), GravityFlags.CenterVertical));
            }
            progressImageView = new Android.Widget.ImageView(Application.Activity, null) {  Enabled=false};
            progressImageView.SetBackgroundColor(Android.Graphics.Color.Rgb(0xFE, 0x5E, 00));
            (AndroidView as AndroidFrameLayout).AddView(progressImageView, new Android.Widget.FrameLayout.LayoutParams(0, Dip2Px(2), GravityFlags.CenterVertical));
            thumbButton = new Android.Widget.Button(Application.Activity, null) { Background = new Android.Graphics.Drawables.GradientDrawable(),Enabled=false };
            (AndroidView as AndroidFrameLayout).AddView(thumbButton, new Android.Widget.FrameLayout.LayoutParams(Dip2Px(ThumbRadius), Dip2Px(ThumbRadius), GravityFlags.CenterVertical));
            androidHorizonetalSeekBar = new AndroidHorizontalSeekBar(Application.Activity, this);
            (AndroidView as AndroidFrameLayout).AddView(androidHorizonetalSeekBar, new Android.Widget.FrameLayout.LayoutParams(Android.Views.ViewGroup.LayoutParams.MatchParent, Android.Views.ViewGroup.LayoutParams.MatchParent));
        }
        uint progressColor = 0xFFEB642C;
        /// <summary>
        /// è¿›åº¦é¢œè‰²
        /// </summary>
        /// <value>The color of the progress.</value>
        public uint ProgressColor
        {
            get
            {
                return progressColor;
            }
            set
            {
                progressColor = value;
                int r = (byte)(progressColor / 256 / 256 % 256);
                int g = (byte)(progressColor / 256 % 256);
                int b = (byte)(progressColor % 256);
                int a = (byte)(progressColor / 256 / 256 / 256 % 256);
                progressImageView.SetBackgroundColor(Android.Graphics.Color.Argb(a, r, g, b));
            }
        }
        public int SleepTime = 0;
        uint backgroundColor = (uint)Android.Graphics.Color.WhiteSmoke.ToArgb();
        /// <summary>
        /// åº•部颜色
        /// </summary>
        /// <value>The color of the background.</value>
        public new uint BackgroundColor
        {
            get
            {
                return backgroundColor;
            }
            set
            {
                backgroundColor = value;
                int r = (byte)(backgroundColor / 256 / 256 % 256);
                int g = (byte)(backgroundColor / 256 % 256);
                int b = (byte)(backgroundColor % 256);
                int a = (byte)(backgroundColor / 256 / 256 / 256 % 256);
                backImageView.SetBackgroundColor(Android.Graphics.Color.Argb(a, r, g, b));
            }
        }
        /// <summary>
        ///  è¿›åº¦å˜åŒ–事件
        /// </summary>
        public Action<View, int> ProgressChanged;
        /// <summary>
        /// æœ€å¤§å€¼
        /// </summary>
        /// <value>The max.</value>
        public int Max
        {
            get
            {
                return androidHorizonetalSeekBar.Max;
            }
            set
            {
                androidHorizonetalSeekBar.Max = value;
            }
        }
        /// <summary>
        /// æ˜¯å¦å…è®¸æ»‘动滑块
        /// </summary>
        /// <value><c>true</c> if is can scrolled; otherwise, <c>false</c>.</value>
        public bool IsCanScrolled
        {
            get
            {
                return androidHorizonetalSeekBar.Enabled;
            }
            set
            {
                thumbButton.Visibility = value ? ViewStates.Visible : ViewStates.Gone;
                androidHorizonetalSeekBar.Enabled = value;
            }
        }
        //2019-08-29 æ”¹100毫秒
        public int DelayTime = 100;
        //防止跳动,延时显示状态
        public DateTime delayDateTime = DateTime.MinValue;
        /// <summary>
        /// å½“前进度
        /// </summary>
        /// <value>The progress.</value>
        public int Progress
        {
            get
            {
                return androidHorizonetalSeekBar.Progress;
            }
            set
            {
                //发送命令后1000毫秒内不更新状态,防止跳动
                if ((DateTime.Now - delayDateTime).TotalMilliseconds < DelayTime)
                {
                    return;
                }
                androidHorizonetalSeekBar.Progress = value;
                if (!IsCanRefresh)
                {
                    return;
                }
                int width = (int)(androidHorizonetalSeekBar.Progress * 1.0 / androidHorizonetalSeekBar.Max * (Width - thumbButton.LayoutParameters.Width));
                progressImageView.LayoutParameters.Width = width + thumbButton.LayoutParameters.Width / 2;
                var layoutParameter = (thumbButton.LayoutParameters as Android.Widget.FrameLayout.LayoutParams);
                layoutParameter.LeftMargin = width;
                thumbButton.LayoutParameters = layoutParameter;
            }
        }
        uint thumbColor = 0xFFFFFFFF;
        /// <summary>
        /// æ»‘块颜色
        /// </summary>
        /// <value>The color of the background.</value>
        public uint ThumbColor
        {
            get
            {
                return thumbColor;
            }
            set
            {
                thumbColor = value;
                int r = (byte)(thumbColor / 256 / 256 % 256);
                int g = (byte)(thumbColor / 256 % 256);
                int b = (byte)(thumbColor % 256);
                int a = (byte)(thumbColor / 256 / 256 / 256 % 256);
                ((Android.Graphics.Drawables.GradientDrawable)thumbButton.Background).SetColor(Android.Graphics.Color.Argb(a, r, g, b));
            }
        }
        public DateTime dateTime = DateTime.MinValue;
        internal override bool TouchEvent(MotionEvent e)
        {
            if (!IsCanMove||!Enable)
            {
                return true;
            }
            delayDateTime = DateTime.Now;
            switch (e.Action)
            {
                case MotionEventActions.Down:
                    dateTime = DateTime.MinValue;
                    break;
                case MotionEventActions.Move:
                    if (dateTime == DateTime.MinValue)
                    {
                        dateTime = DateTime.Now;
                    }
                    setValue(e.GetX());
                    break;
                case MotionEventActions.Up:
                    dateTime = DateTime.MinValue;
                    setValue(e.GetX());
                    break;
            }
            return base.TouchEvent(e);
        }
        int beforValue;
        /// <summary>
        /// æ˜¯å¦å¯ä»¥æ»‘动
        /// </summary>
        public bool IsCanMove = true;
        void setValue(float x)
        {
            if (x < 0)
            {
                x = 0;
            }
            if (Width - thumbButton.LayoutParameters.Width < x)
            {
                x = Width - thumbButton.LayoutParameters.Width;
            }
            var tempValue = androidHorizonetalSeekBar.Progress;
            androidHorizonetalSeekBar.Progress = (int)(x / (Width - thumbButton.LayoutParameters.Width) * Max);
            int width = (int)(androidHorizonetalSeekBar.Progress * 1.0 / androidHorizonetalSeekBar.Max * (Width - thumbButton.LayoutParameters.Width));
            progressImageView.LayoutParameters.Width = width + thumbButton.LayoutParameters.Width / 2;
            var layoutParameter = thumbButton.LayoutParameters as Android.Widget.FrameLayout.LayoutParams;
            layoutParameter.LeftMargin = width;
            thumbButton.LayoutParameters = layoutParameter;
            if (tempValue != androidHorizonetalSeekBar.Progress || tempValue == 0 || tempValue == Max|| dateTime== DateTime.MinValue)
            {
                //点击下或者弹起或者滑动时间500毫秒的时候,就触发事件
                if (ProgressChanged != null
                    && SleepTime < (DateTime.Now - dateTime).TotalMilliseconds)
                {
                    dateTime = DateTime.MinValue;
                    delayDateTime = DateTime.Now;
                    ProgressChanged(this, androidHorizonetalSeekBar.Progress);
                }
            }
        }
        int thumbRadius = 10;
        public int ThumbRadius
        {
            get
            {
                return thumbRadius;
            }
            set
            {
                thumbRadius = value;
                if (!IsCanRefresh)
                {
                    return;
                }
                thumbButton.LayoutParameters.Width = Dip2Px(ThumbRadius) * 2;
                thumbButton.LayoutParameters.Height = Dip2Px(ThumbRadius) * 2;
                var gradientDrawable = thumbButton.Background as Android.Graphics.Drawables.GradientDrawable;
                gradientDrawable.SetCornerRadius(Dip2Px(ThumbRadius));
                gradientDrawable.SetSize(Dip2Px(ThumbRadius) * 2, Dip2Px(ThumbRadius) * 2);
                thumbButton.Background = gradientDrawable;
                ThumbColor = thumbColor;
            }
        }
        public override void Refresh()
        {
            base.Refresh();
            ThumbRadius = thumbRadius;
            ProgressColor = progressColor;
            Progress = androidHorizonetalSeekBar.Progress;
        }
        /// <summary>
        /// éœ€è¦é‡å†™çš„视图
        /// </summary>
        class AndroidHorizontalSeekBar : Android.Widget.SeekBar
        {
            View view;
            public AndroidHorizontalSeekBar(Context context, View view)
                : base(context)
            {
                this.view = view;
                ProgressDrawable = null;
                SetThumb(null);
            }
            /// <summary>
            /// å¦‚果已经是横向滑动,父控件不允许再请求中断
            /// </summary>
            bool isHorizontalActioned;
            /// <summary>
            /// è®°å½•最后点击的X轴坐标
            /// </summary>
            float mLastMotionX;
            /// <summary>
            /// ç‚¹å‡»Y轴的坐标
            /// </summary>
            float mLastMotionY;
            public override bool OnTouchEvent(MotionEvent e)
            {
                switch (e.Action)
                {
                    case MotionEventActions.Down:
                        isHorizontalActioned = false;
                        //进来的时候禁止父控制打断
                        Parent?.RequestDisallowInterceptTouchEvent(true);
                        //记录点击的X坐标
                        mLastMotionX = e.RawX;
                        mLastMotionY = e.RawY;
                        break;
                    case MotionEventActions.Move:
                        var deltaX = mLastMotionX - e.RawX;
                        var deltaY = mLastMotionY - e.RawY;
                        //如果主要滑动的是Y轴比较大,返回
                        if (Math.Abs(deltaX) < Math.Abs(deltaY))
                        {
                            if (ViewConfiguration.Get(Context).ScaledTouchSlop < Math.Abs(deltaY) && !isHorizontalActioned)
                            {
                                Parent?.RequestDisallowInterceptTouchEvent(false);
                            }
                            return true;
                        }
                        //如果不在滑动范围内,不执行滑动
                        if (Math.Abs(deltaX) < ViewConfiguration.Get(Context).ScaledTouchSlop)
                        {
                            return true;
                        }
                        isHorizontalActioned = true;
                        view?.TouchEvent(e);
                        break;
                    case MotionEventActions.Up:
                        view?.TouchEvent(e);
                        break;
                }
                return true;
            }
        }
    }
}
ZigbeeApp/Shared.Droid/UI/ImageView.cs
New file
@@ -0,0 +1,344 @@
using System;
using Android.Content;
using Android.Graphics;
using Android.Graphics.Drawables;
using Android.OS;
using Android.Util;
using Android.Views;
namespace Shared
{
    //已经全面检查了代码
    /// <summary>
    /// Button æŒ‰é”®
    /// </summary>
    public class ImageView : View
    {
        /// <summary>
        ///  å½“前视图
        /// </summary>
        /// <value>The android button.</value>
        AndroidImageView currentButton
        {
            get
            {
                return AndroidView as AndroidImageView;
            }
            set
            {
                AndroidView = value;
            }
        }
        /// <summary>
        /// æž„造函数
        /// </summary>
        public ImageView()
        {
            currentButton = new AndroidImageView(Application.Activity, this);
        }
        internal string imagePath,tempImagePath;
        /// <summary>
        /// éžé€‰ä¸­çŠ¶æ€çš„èƒŒæ™¯å›¾è·¯å¾„
        /// </summary>
        /// <value>The un selected image path.</value>
        public string ImagePath
        {
            get
            {
                return imagePath;
            }
            set
            {
                tempImagePath = value;
                if(!IsCanRefresh){
                    return;
                }
                if (imageBytes != null)
                {
                    (AndroidView as AndroidImageView).SetImageDrawable(Bytes2Drawable(imageBytes));
                    return;
                }
                if (ImagePath == value) {
                    return;
                }
                imagePath=value;
                Background(value);
            }
        }
        byte[] imageBytes;
        public byte[] ImageBytes
        {
            get
            {
                return imageBytes;
            }
            set
            {
                imageBytes = value;
                ImagePath = tempImagePath;
            }
        }
        public override uint Radius
        {
            get
            {
                return base.Radius;
            }
            set
            {
                base.Radius = value;
                if (!IsCanRefresh && Radius == value)
                {
                    return;
                }
                currentButton.Invalidate();
            }
        }
        public override void Refresh()
        {
            base.Refresh();
            ImagePath = tempImagePath;
        }
    }
    public class AndroidImageView : Android.Widget.ImageView
    {
        public override bool OnTouchEvent(MotionEvent e)
        {
            base.OnTouchEvent(e);
            if (view != null)
            {
                view.TouchEvent(e);
            }
            return true;
        }
        /**
        * å›¾ç‰‡çš„类型,圆形or圆角
        */
        private int type=TYPE_ROUND;
        public static int TYPE_CIRCLE = 0;
        public static int TYPE_ROUND = 1;
        /**
         * åœ†è§’大小的默认值
         */
        private static int BODER_RADIUS_DEFAULT = 10;
        /**
         * ç»˜å›¾çš„Paint
         */
        private Paint mBitmapPaint;
        /**
         * åœ†è§’的半径
         */
        private int mRadius;
        /**
         * 3x3 çŸ©é˜µï¼Œä¸»è¦ç”¨äºŽç¼©å°æ”¾å¤§
         */
        private Matrix mMatrix;
        /**
         * æ¸²æŸ“图像,使用图像为绘制图形着色
         */
        private BitmapShader mBitmapShader;
        /**
         * view的宽度
         */
        private int mWidth;
        private RectF mRoundRect;
        View view;
        public AndroidImageView(Context context, View view)
                : base(context)
        {
            this.view = view;
            mMatrix = new Matrix();
            mBitmapPaint = new Paint();
            mBitmapPaint.AntiAlias = true;
            //TypedArray a = context.obtainStyledAttributes(attrs,
            //      R.styleable.RoundImageView);
            //mBorderRadius = a.getDimensionPixelSize(
            //      R.styleable.RoundImageView_borderRadius, (int)TypedValue
            //              .applyDimension(TypedValue.COMPLEX_UNIT_DIP,
            //                      BODER_RADIUS_DEFAULT, getResources()
            //                              .getDisplayMetrics()));// é»˜è®¤ä¸º10dp
            //type = a.getInt(R.styleable.RoundImageView_type, TYPE_CIRCLE);// é»˜è®¤ä¸ºCircle
            //a.recycle();
        }
        protected override void OnMeasure(int widthMeasureSpec, int heightMeasureSpec)
        {
            base.OnMeasure(widthMeasureSpec, heightMeasureSpec);
            ///**
            // * å¦‚果类型是圆形,则强制改变view的宽高一致,以小值为准
            // */
            if (type == TYPE_CIRCLE)
            {
                mWidth = Math.Min(MeasuredWidth, MeasuredHeight);
                mRadius = mWidth / 2;
                SetMeasuredDimension(mWidth, mWidth);
            }
        }
        /**
         * åˆå§‹åŒ–BitmapShader
         */
        private void setUpShader()
        {
            Drawable drawable = this.Drawable;
            if (drawable == null)
            {
                return;
            }
            Bitmap bmp = drawableToBitamp(drawable);
            if (bmp == null)
            {
                return;
            }
            // å°†bmp作为着色器,就是在指定区域内绘制bmp
            mBitmapShader = new BitmapShader(bmp, Shader.TileMode.Clamp, Shader.TileMode.Clamp);
            float scale = 1.0f;
            if (type == TYPE_CIRCLE)
            {
                // æ‹¿åˆ°bitmap宽或高的小值
                int bSize = Math.Min(bmp.Width, bmp.Height);
                scale = mWidth * 1.0f / bSize;
            }
            else if (type == TYPE_ROUND)
            {
                //Log.e("TAG",
                //"b'w = " + bmp.getWidth() + " , " + "b'h = "
                //+ bmp.getHeight());
                if (!(bmp.Width == Width && bmp.Height == Height))
                {
                    // å¦‚果图片的宽或者高与view的宽高不匹配,计算出需要缩放的比例;缩放后的图片的宽高,一定要大于我们view的宽高;所以我们这里取大值;
                    scale = Math.Max(Width * 1.0f / bmp.Width,
                                     Height * 1.0f / bmp.Height);
                }
            }
            // shader的变换矩阵,我们这里主要用于放大或者缩小
            mMatrix.SetScale(scale, scale);
            // è®¾ç½®å˜æ¢çŸ©é˜µ
            mBitmapShader.SetLocalMatrix(mMatrix);
            // è®¾ç½®shader
            mBitmapPaint.SetShader(mBitmapShader);
        }
        protected override void OnDraw(Canvas canvas)
        {
            // Log.e("TAG", "onDraw");
            if (Drawable == null)
            {
                return;
            }
            setUpShader();
            if (type == TYPE_ROUND)
            {
                canvas.DrawRoundRect(mRoundRect, view.Radius, view.Radius,
                        mBitmapPaint);
            }
            else
            {
                canvas.DrawCircle(mRadius, mRadius, mRadius, mBitmapPaint);
                // drawSomeThing(canvas);
            }
        }
        protected override void OnSizeChanged(int w, int h, int oldw, int oldh)
        {
            base.OnSizeChanged(w, h, oldw, oldh);
            // åœ†è§’图片的范围
            if (type == TYPE_ROUND)
                mRoundRect = new RectF(0, 0, w, h);
        }
        /**
         * drawable转bitmap
         *
         * @param drawable
         * @return
         */
        private Bitmap drawableToBitamp(Drawable drawable)
        {
            if (drawable.GetType() == typeof(BitmapDrawable))
            {
                BitmapDrawable bd = (BitmapDrawable)drawable;
                return bd.Bitmap;
            }
            int w = drawable.IntrinsicWidth;
            int h = drawable.IntrinsicHeight;
            if (w <= 0 || h <= 0)
            {
                return null;
            }
            Bitmap bitmap = Bitmap.CreateBitmap(w, h, Bitmap.Config.Argb8888);
            Canvas canvas = new Canvas(bitmap);
            drawable.SetBounds(0, 0, w, h);
            drawable.Draw(canvas);
            return bitmap;
        }
        private static string STATE_INSTANCE = "state_instance";
        private static string STATE_TYPE = "state_type";
        private static string STATE_BORDER_RADIUS = "state_border_radius";
        protected override IParcelable OnSaveInstanceState()
        {
            Bundle bundle = new Bundle();
            bundle.PutParcelable(STATE_INSTANCE, base.OnSaveInstanceState());
            bundle.PutInt(STATE_TYPE, type);
            bundle.PutInt(STATE_BORDER_RADIUS, (int)view.Radius);
            return bundle;
        }
        protected override void OnRestoreInstanceState(IParcelable state)
        {
            if (state.GetType() == typeof(Bundle))
            {
                Bundle bundle = (Bundle)state;
                base.OnRestoreInstanceState((IParcelable)bundle
                            .GetParcelable(STATE_INSTANCE));
                this.type = bundle.GetInt(STATE_TYPE);
                view.Radius = (uint)bundle.GetInt(STATE_BORDER_RADIUS);
            }
            else
            {
                base.OnRestoreInstanceState(state);
            }
        }
        public void setType(int type)
        {
            if (this.type != type)
            {
                this.type = type;
                if (this.type != TYPE_ROUND && this.type != TYPE_CIRCLE)
                {
                    this.type = TYPE_CIRCLE;
                }
                RequestLayout();
            }
        }
        public int dp2px(int dpVal)
        {
            return (int)TypedValue.ApplyDimension(ComplexUnitType.Dip,
                                  dpVal, Resources.DisplayMetrics);
        }
    }
}
ZigbeeApp/Shared.Droid/UI/Lanuage.cs
New file
@@ -0,0 +1,90 @@
using System;
using System.IO;
namespace Shared
{
    public static class Language
    {
        static System.Collections.Generic.List<string> currentStringList;
        static Language()
        {
            UpdateLanguage ();
            if (0 < currentStringList.Count&&currentStringList[0].StartsWith("CurrentLanguage=")) {
                CurrentLanguage = currentStringList [0].Substring ("CurrentLanguage=".Length);
            }
        }
        static System.Collections.Generic.List<string> readStringList(string fileName,System.Text.Encoding encoding)
        {
            var stringList = new System.Collections.Generic.List<string> ();
            System.IO.StreamReader fs = null;
            try {
                var language = Application.Activity.Assets.Open(fileName);
                fs = new  StreamReader(language,encoding);
                string s;
                while(null!=(s=fs.ReadLine()))
                {
                    stringList.Add(s.Trim());
                }
                language.Close();
                return stringList;
            } catch {
                return stringList;
            } finally {
                try {
                    if (fs != null) {
                        fs.Close ();
                    }
                } catch {
                }
            }
        }
        /// <summary>
        /// é‡æ–°æ›´æ–°è¯­è¨€åº“数据
        /// </summary>
        public static void UpdateLanguage()
        {
            currentStringList = readStringList("Language.ini", System.Text.Encoding.UTF8);
        }
        /// <summary>
        /// å½“前设置的语言
        /// </summary>
        public static string CurrentLanguage="English";
        /// <summary>
        /// æ ¹æ®ID获取对应的备注
        /// </summary>
        /// <returns>The by I.</returns>
        /// <param name="id">Identifier.</param>
        public static string StringByID(int id)
        {
            bool flag = false;
            for (int i = 0; i < currentStringList.Count; i++) {
                string currentLine = currentStringList [i];
                if (flag) {
                    if (currentLine.Contains("=")&&currentLine.StartsWith(id.ToString()+"=")) {
                        return currentLine.Substring (id.ToString ().Length + 1);
                    }
                } else if (currentLine == "[" + CurrentLanguage + "]") {
                    flag = true;
                } else {
                    continue;
                }
            }
            return string.Empty;
        }
        public static string  []GetAllLanguage()
        {
            System.Collections.Generic.List<string> list = new System.Collections.Generic.List<string> ();
            for (int i = 0; i < currentStringList.Count; i++) {
                string currentLine = currentStringList [i].Trim();
                if (currentLine.StartsWith ("[") && currentLine.EndsWith ("]")) {
                    list.Add(currentLine.Substring(1,currentLine.Length-2));
                }
            }
            return list.ToArray();
        }
    }
}
ZigbeeApp/Shared.Droid/UI/Loading.cs
New file
@@ -0,0 +1,196 @@
using System;
using Android.Content;
using Android.Runtime;
using Android.Widget;
using Android.Util;
using Android.Views;
using Android.Graphics.Drawables;
namespace Shared
{
    public class Loading : View
    {
        public bool CurStatus = false;
        public Loading ()
        {
            AndroidView = new MyLoading (Application.Activity);
            CurStatus = false;
        }
        /// <summary>
        /// Refresh this instance.
        /// </summary>
        public override void Refresh ()
        {
            base.Refresh ();
            Hide ();
        }
        /// <summary>
        /// Hide this instance.
        /// </summary>
        public void Hide ()
        {
            (AndroidView as MyLoading).textView.Text = "Loading......";
            AndroidView.Visibility = Android.Views.ViewStates.Gone;
            CurStatus = false;
        }
        /// <summary>
        /// Start this instance.
        /// </summary>
        public void Start ()
        {
            (AndroidView as MyLoading).textView.Text = "Loading......";
            AndroidView.BringToFront ();
            AndroidView.Visibility = ViewStates.Visible;
            CurStatus = true;
        }
        /// <summary>
        /// Start this instance.
        /// </summary>
        public void Start (string s)
        {
            (AndroidView as MyLoading).textView.Text = s;
            AndroidView.BringToFront ();
            AndroidView.Visibility = ViewStates.Visible;
        }
        public string Text {
            get {
                return (AndroidView as MyLoading).textView.Text;
            }
            set {
                (AndroidView as MyLoading).textView.Text = value;
            }
        }
        public virtual uint LodingBackgroundColor {
            get {
                return (AndroidView as MyLoading).LodingBackgroundColor;
            }
            set {
                (AndroidView as MyLoading).LodingBackgroundColor = value;
            }
        }
    }
    class MiddleLinearLayout : LinearLayout
    {
        public MiddleLinearLayout (Context context)
            : base (context)
        {
        }
        int mMaxWidth {
            get {
                var metric = new DisplayMetrics ();
                Application.Activity.WindowManager.DefaultDisplay.GetRealMetrics (metric);
                return metric.WidthPixels * 3 / 4;
            }
        }
        protected override void OnMeasure (int widthMeasureSpec, int heightMeasureSpec)
        {
            var widthMode = MeasureSpec.GetMode (widthMeasureSpec);
            var widthSize = MeasureSpec.GetSize (widthMeasureSpec);
            if (widthMode == MeasureSpecMode.Exactly) {
                widthSize = widthSize <= mMaxWidth ? widthSize
                        : (int)mMaxWidth;
            }
            if (widthMode == MeasureSpecMode.Unspecified) {
                widthSize = widthSize <= mMaxWidth ? widthSize
                        : (int)mMaxWidth;
            }
            if (widthMode == MeasureSpecMode.AtMost) {
                widthSize = widthSize <= mMaxWidth ? widthSize
                        : (int)mMaxWidth;
            }
            var maxWidthMeasureSpec = MeasureSpec.MakeMeasureSpec (widthSize,
                    widthMode);
            base.OnMeasure (maxWidthMeasureSpec, heightMeasureSpec);
        }
    }
    class MyLoading : Android.Widget.LinearLayout
    {
        ProgressBar Progress;
        public Android.Widget.TextView textView;
        LinearLayout tempLinearLayout;
        public MyLoading (Context context)
            : base (context)
        {
            //Progress = new ProgressBar(context);
            //SetBackgroundColor(Android.Graphics.Color.Argb(50, 0x32, 0x32, 0x32));
            //SetGravity(GravityFlags.Center);
            //tempLinearLayout = new LinearLayout(context) { Orientation = Orientation.Vertical };
            //tempLinearLayout.SetGravity(GravityFlags.CenterHorizontal);
            //tempLinearLayout.AddView(Progress, new Android.Views.ViewGroup.LayoutParams(Android.Views.ViewGroup.LayoutParams.WrapContent, Android.Views.ViewGroup.LayoutParams.WrapContent));
            //textView = new Android.Widget.TextView(context);
            //textView.Text = "Please wait....";
            //tempLinearLayout.AddView(textView, new Android.Views.ViewGroup.LayoutParams(Android.Views.ViewGroup.LayoutParams.WrapContent, Android.Views.ViewGroup.LayoutParams.WrapContent));
            //AddView(tempLinearLayout, new Android.Views.ViewGroup.LayoutParams(Android.Views.ViewGroup.LayoutParams.WrapContent, Android.Views.ViewGroup.LayoutParams.WrapContent));
            //tempLinearLayout.SetPadding(20, 20, 20, 20);
            Progress = new ProgressBar (context);
            SetBackgroundColor (Android.Graphics.Color.Argb (50, 0x32, 0x32, 0x32));
            SetGravity (GravityFlags.Center);
            tempLinearLayout = new MiddleLinearLayout (context) { Orientation = Orientation.Vertical };
            tempLinearLayout.SetGravity (GravityFlags.CenterHorizontal);
            tempLinearLayout.AddView (Progress, new Android.Views.ViewGroup.LayoutParams (Android.Views.ViewGroup.LayoutParams.WrapContent, Android.Views.ViewGroup.LayoutParams.WrapContent));
            textView = new Android.Widget.TextView (context);
            textView.Text = "Loading......";
            tempLinearLayout.AddView (textView, new Android.Views.ViewGroup.LayoutParams (Android.Views.ViewGroup.LayoutParams.WrapContent, Android.Views.ViewGroup.LayoutParams.WrapContent));
            AddView (tempLinearLayout, new Android.Views.ViewGroup.LayoutParams (Android.Views.ViewGroup.LayoutParams.WrapContent, Android.Views.ViewGroup.LayoutParams.WrapContent));
            tempLinearLayout.SetPadding (20, 20, 20, 20);
        }
        uint loadingBackgroundColor;
        /// <summary>
        /// èƒŒæ™¯é¢œè‰²
        /// </summary>
        /// <value>The color of the background.</value>
        public virtual uint LodingBackgroundColor {
            get {
                return loadingBackgroundColor;
            }
            set {
                loadingBackgroundColor = value;
                if (this.GetType () != typeof (ImageView)) {
                    if (tempLinearLayout.Background == null || tempLinearLayout.Background.GetType () != typeof (GradientDrawable)) {
                        tempLinearLayout.Background = new Android.Graphics.Drawables.GradientDrawable ();
                    }
                    var gradientDrawable = (GradientDrawable)tempLinearLayout.Background;
                    gradientDrawable.SetCornerRadius (DensityUtil.Dip2Px (6));
                    byte r, g, b, a;
                    r = (byte)(loadingBackgroundColor / 256 / 256 % 256);
                    g = (byte)(loadingBackgroundColor / 256 % 256);
                    b = (byte)(loadingBackgroundColor % 256);
                    a = (byte)(loadingBackgroundColor / 256 / 256 / 256 % 256);
                    gradientDrawable.SetColor (Android.Graphics.Color.Argb (a, r, g, b).ToArgb ());
                }
            }
        }
        /// <summary>
        /// ç‚¹å‡»äº‹ä»¶
        /// </summary>
        /// <returns>The touch event.</returns>
        /// <param name="e">E.</param>
        public override bool OnTouchEvent (Android.Views.MotionEvent e)
        {
            //事件自己处理
            return true;
        }
    }
}
ZigbeeApp/Shared.Droid/UI/MusicVerticalScrolViewLayout.cs
New file
@@ -0,0 +1,418 @@
using System;
using Android.Content;
using Android.Views;
using Android.Views.Animations;
namespace Shared
{
    /// <summary>
    /// éŸ³ä¹æ»‘动视图
    /// </summary>
    public class MusicVerticalScrolViewLayout : ViewGroup
    {
        /// <summary>
        /// æž„造函数
        /// </summary>
        public MusicVerticalScrolViewLayout()
        {
            viewGroup = new AndroidScrolView11(Application.Activity, this);
            var tempViewGroup = new Android.Widget.FrameLayout(Application.Activity);
            //ScrollView这样的控件需要先有个容器,而且容器高宽不能设定,而是由容器里的子控件高度决定
            viewGroup.AddView(tempViewGroup);
            realViewGroup = new Android.Widget.FrameLayout(Application.Activity);
            tempViewGroup.AddView(realViewGroup);
        }
        //这个方法检查过没有问题
        /// <summary>
        /// æ·»åŠ å­æŽ§ä»¶
        /// </summary>
        /// <param name="view">View.</param>
        public override void AddChidren(View view)
        {
            base.AddChidren(view);
            int height = 0;
            foreach(View tempView in viewList){
                if(height<tempView.Bottom)
                {
                    height = tempView.Bottom;
                }
            }
            realViewGroup.LayoutParameters.Height = height < viewGroup.LayoutParameters.Height ? viewGroup.LayoutParameters.Height+10 : height;
        }
        /// <summary>
        ///  æ ¹æ®ç»å¯¹åæ ‡æ¥ç¡®å®šå½“前选择了哪个控件
        /// </summary>
        /// <returns><c>true</c>, if range of view was ined, <c>false</c> otherwise.</returns>
        /// <param name="view">View.</param>
        /// <param name="point">Point.</param>
        bool inRangeOfView(Android.Views.View view, Android.Graphics.Point point)
        {
            var location = new int[2];
            view.GetLocationOnScreen(location);
            int y = location[1];
            if (point.Y < y || point.Y > (y + view.Height))
            {
                return false;
            }
            return true;
        }
        bool isSameZone (Android.Views.View view)
        {
            var location = new int [2];
            view.GetLocationOnScreen (location);
            int y = location [1];
            if (y + view.Height / 2 < selectViewBeforeY || y > selectViewBeforeY + view.Height / 2) {
                return false;
            }
            return true;
        }
        /// <summary>
        /// æ ¹æ®ç‚¹å‡»ä½ç½®æ‰¾å‡ºç‚¹å‡»åˆ°çš„视图
        /// </summary>
        /// <returns>The view of point.</returns>
        /// <param name="point">Point.</param>
        /// <param name="view">Uiview.</param>
        Android.Views.View replaceViewOfPoint(Android.Views.View view, Android.Graphics.Point point)
        {
            //第一个是背景图
            for (int i = realViewGroup.ChildCount - 1; 0 <= i; i--)
            {
                var tempView = realViewGroup.GetChildAt(i);
                if (tempView != view)
                {
                    if (inRangeOfView(tempView, point))
                    {
                        return tempView;
                    }
                }
            }
            return null;
        }
        /// <summary>
        ///
        /// </summary>
        public Action<View, View> ReplaceChanged;
        /// <summary>
        /// é•¿æŒ‰äº‹ä»¶
        /// </summary>
        public Action<View> LongPressAction;
        /// <summary>
        /// æ ¹æ®ç‚¹å‡»ä½ç½®æ‰¾å‡ºç‚¹å‡»åˆ°çš„视图
        /// </summary>
        /// <returns>返回点击到的视图</returns>
        /// <param name="point">当前点击位置</param>
        Android.Views.View selectedViewByPoint(Android.Graphics.Point point)
        {
            //第一个是背景图
            for (int i = realViewGroup.ChildCount - 1; 0 <= i; i--)
            {
                var tempView = realViewGroup.GetChildAt(i);
                {
                    if (inRangeOfView(tempView, point))
                    {
                        return tempView;
                    }
                }
            }
            return null;
        }
        /// <summary>
        /// å½“前选中按键的初始点
        /// </summary>
        Android.Graphics.Point originPressPoint;
        /// <summary>
        /// å½“前选中的视图起点
        /// </summary>
        Android.Graphics.Point selectedViewPoint;
        /// <summary>
        /// å½“前选中的视图
        /// </summary>
        Android.Views.View selectedAndroidView;
        /// <summary>
        /// å‡†å¤‡äº¤æ¢ä½ç½®çš„视图
        /// </summary>
        Android.Views.View replaceAndroidView;
        /// <summary>
        /// èŽ·å–å½“å‰View的中心点
        /// </summary>
        /// <returns>The point.</returns>
        /// <param name="view">View.</param>
        Android.Graphics.Point centerPoint(Android.Views.View view)
        {
            int[] location = new int[2];
            view.GetLocationOnScreen(location);
            int x = location[0];
            int y = location[1];
            x += view.Width / 2;
            y += view.Height / 2;
            return new Android.Graphics.Point(x, y);
        }
        float selectViewBeforeY;
        /// <summary>
        /// ç‚¹å‡»å¼€å§‹çš„事件
        /// </summary>
        /// <param name="e">E.</param>
        internal void TouchEventDown(MotionEvent e){
            //找出当前点击位置的视图
            selectedAndroidView = selectedViewByPoint(new Android.Graphics.Point((int)e.RawX, (int)e.RawY));
            if (selectedAndroidView == null)
            {
                return ;
            }
            selectedAndroidView.BringToFront();
            var location = new int [2];
            selectedAndroidView.GetLocationOnScreen (location);
            selectViewBeforeY = location [1];
            originPressPoint = new Android.Graphics.Point((int)e.RawX, (int)e.RawY);
            selectedViewPoint = new Android.Graphics.Point((int)selectedAndroidView.GetX(), (int)selectedAndroidView.GetY());
            isFirst = true;
        }
        /// <summary>
        /// ç‚¹å‡»äº‹ä»¶ç§»åЍ
        /// </summary>
        /// <param name="e">E.</param>
        internal void TouchEventMove(MotionEvent e)
        {
            if (selectedAndroidView == null)
            {
                return;
            }
            //selectedAndroidView.SetX(selectedViewPoint.X + e.RawX - originPressPoint.X);
            selectedAndroidView.SetY(selectedViewPoint.Y + e.RawY - originPressPoint.Y);
            //获取当前视图进入了哪个视图的区域
            replaceAndroidView = replaceViewOfPoint(selectedAndroidView, centerPoint(selectedAndroidView));
            if (replaceAndroidView != null)
            {
                if (!isFirst)
                {
                    return;
                }
                isFirst = false;
                if (replaceAndroidView == null)
                {
                    return;
                }
                replaceAndroidView.ClearAnimation();
                /** è®¾ç½®ç¼©æ”¾åŠ¨ç”» */
                replaceAndroidView.Animation = new AlphaAnimation(1.0f, .8f);
                replaceAndroidView.Animation.Duration = 1000;
                replaceAndroidView.Animation.StartNow();
            }
        }
        /// <summary>
        /// ç‚¹å‡»äº‹ä»¶å¼¹èµ·
        /// </summary>
        /// <param name="e">E.</param>
        internal void TouchEventUp(MotionEvent e)
        {
            if (selectedAndroidView == null)
            {
                return;
            }
            View selectedView = null;
            foreach (View view in viewList)
            {
                if (view.AndroidView == selectedAndroidView)
                {
                    selectedView = view;
                    break;
                }
            }
            //selectedAndroidView.SetX(selectedViewPoint.X);
            if(isSameZone(selectedAndroidView))
            {
                selectedAndroidView.SetY (selectedViewPoint.Y);
                return;
            }
            selectedAndroidView.SetY (selectedViewPoint.Y);
            if (replaceAndroidView == null)
            {
                if (LongPressAction != null)
                {
                    LongPressAction(selectedView);
                }
                return;
            }
            View replaceView = null;
            foreach (View view in viewList)
            {
                if (view.AndroidView == replaceAndroidView)
                {
                    replaceView = view;
                    break;
                }
            }
            if (ReplaceChanged != null)
            {
                ReplaceChanged(replaceView, selectedView);
            }
        }
        /// <summary>
        /// ç»™å½“前选择中的控件个动画缩小的效果
        /// </summary>
        internal void scaleSelectedAndroidView()
        {
            if (selectedAndroidView == null)
            {
                return;
            }
            selectedAndroidView.ClearAnimation();
            /** è®¾ç½®ç¼©æ”¾åŠ¨ç”» */
            selectedAndroidView.Animation = new AlphaAnimation(1.0f, 0.8f);
            selectedAndroidView.Animation.Duration = 1000;
            selectedAndroidView.Animation.StartNow();
        }
        /// <summary>
        ///  æ˜¯å¦ç¬¬ä¸€æ¬¡åŠ è½½
        /// </summary>
        bool isFirst;
        /// <summary>
        /// ç«–直方向滑动控件
        /// </summary>
        internal class AndroidScrolView11 : Android.Widget.ScrollView, GestureDetector.IOnGestureListener
        {
            MusicVerticalScrolViewLayout _view;
            /// <summary>
            /// æ˜¯å¦é•¿æŒ‰
            /// </summary>
            bool isLongPress;
            GestureDetector mGesture;
            /// <summary>
            /// æž„造函数
            /// </summary>
            /// <param name="context">Context.</param>
            /// <param name="view">View.</param>
            public AndroidScrolView11(Context context, MusicVerticalScrolViewLayout view)
                : base(context)
            {
                _view = view;
                VerticalScrollBarEnabled = false;
                mGesture = new GestureDetector(context, this) { IsLongpressEnabled = true };
            }
            /// <summary>
            /// é‡å†™ç‚¹å‡»äº‹ä»¶
            /// </summary>
            /// <returns><c>true</c>, if touch event was oned, <c>false</c> otherwise.</returns>
            /// <param name="e">E.</param>
            public override bool OnTouchEvent(MotionEvent e)
            {
                //处理长按的事件
                if (isLongPress)
                {
                    switch (e.Action)
                    {
                        case MotionEventActions.Move:
                            _view.TouchEventMove(e);
                            break;
                        case MotionEventActions.Up:
                            _view.TouchEventUp(e);
                            break;
                    }
                    return true;
                }
                return base.OnTouchEvent(e);
            }
            //是否是活动状态
            bool isLive()
            {
                return Enabled && Visibility == ViewStates.Visible && 0 < Alpha;
            }
            public override bool OnInterceptTouchEvent(MotionEvent ev)
            {
                if (!isLive())
                {
                    return false;
                }
                mGesture.OnTouchEvent(ev);
                //如果是长按,就拦截事件,后面的事件是由自己的TouchEvent处理,子控件会收到取消事件,如果是快速滑动,事件也是自己处理
                if (isLongPress)
                {
                    return true;
                }
                //如果是滑动这里也会返回True
                return base.OnInterceptTouchEvent(ev);
            }
            /// <summary>
            /// è®¾ç½®æ‰€æœ‰çˆ¶è§†å›¾ç¦æ­¢æ‹¦æˆªäº‹ä»¶
            /// </summary>
            /// <param name="b">如果设置True表示不要拦截,如果设置为False表示可以拦截</param>
            void requestParentDisallowInterceptTouchEvent(bool b)
            {
                var tempParent = Parent;
                while (tempParent != null)
                {   //告诉父类不要拦截这个视图的事件
                    tempParent.RequestDisallowInterceptTouchEvent(b);
                    tempParent = tempParent.Parent;
                }
            }
            public bool OnDown(MotionEvent e)
            {
                isLongPress = false;
                _view.TouchEventDown(e);
                requestParentDisallowInterceptTouchEvent(true);
                return false;
            }
            public bool OnFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY)
            {
                //迅速滑动,并松开
                Console.WriteLine($"OnFling随便一划,坐标变化为X:{velocityX},Y:{velocityY}");
                return false;
            }
            public void OnLongPress(MotionEvent e)
            {
                isLongPress = true;
                _view.scaleSelectedAndroidView();
                Console.WriteLine("长按不放");
            }
            public bool OnScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY)
            {
                Console.WriteLine("OnScroll:在屏幕上滑动");
                return false;
            }
            public void OnShowPress(MotionEvent e)
            {
                Console.WriteLine("OnShowPress:手指按下一段时间,还没到长按");
            }
            public bool OnSingleTapUp(MotionEvent e)
            {
                requestParentDisallowInterceptTouchEvent(false);
                Console.WriteLine("OnSingleTapUp:手指弹起");
                return false;
            }
        }
    }
}
ZigbeeApp/Shared.Droid/UI/MyEchartsView.cs
New file
@@ -0,0 +1,182 @@
using System;
using Android.Webkit;
using System.Collections.Generic;
namespace Shared
{
    /// <summary>
    /// Button æŒ‰é”®
    /// </summary>
    public class MyEchartsView : View
    {
        JsonData jsonData = new JsonData { };
        public MyEchartsView()
        {
            webView = new MyWebView(Application.Activity, this);
            webView.SetWebViewClient(new MyWebViewClient
            {
                pageFinishedAction = () =>
                {
                    refresh($"javascript:loadEcharts({Newtonsoft.Json.JsonConvert.SerializeObject(jsonData)},'undefined')");
                }
            });
            webView.LoadUrl("file:///android_asset/Echarts/index.html");
        }
        public void Show(string title, string[] xArray, object[] yArray)
        {
            jsonData.Title = title;
            jsonData.XArray = xArray;
            jsonData.YArray = yArray;
            refresh($"javascript:refreshWithOption({ Newtonsoft.Json.JsonConvert.SerializeObject(jsonData)})");
        }
        public string Unit{
            get{
                return jsonData.Unit;
            }set{
                jsonData.Unit = value;
            }
        }
        /// <summary>
        /// åˆ›æ–°ç•Œé¢
        /// </summary>
        void refresh(string js)
        {
            if ((int)Android.OS.Build.VERSION.SdkInt < 18)
            {
                webView.LoadUrl(js);
            }
            else
            {
                webView.EvaluateJavascript(js, webView);
            }
        }
        MyWebView webView
        {
            get
            {
                return AndroidView as MyWebView;
            }
            set
            {
                AndroidView = value;
            }
        }
        internal class MyWebViewClient : Android.Webkit.WebViewClient
        {
            [Obsolete]
            public override bool ShouldOverrideUrlLoading(Android.Webkit.WebView view, string url)
            {
                view.LoadUrl(url);
                return true;
            }
            public override void OnPageFinished(WebView view, string url)
            {
                base.OnPageFinished(view, url);
                pageFinishedAction?.Invoke();
            }
            internal Action pageFinishedAction;
        }
        class MyWebView : Android.Webkit.WebView, IValueCallback
        {
            View view;
            public MyWebView(Android.Content.Context context, View view)
                : base(context)
            {
                this.view = view;
                SetBackgroundColor(Android.Graphics.Color.Transparent);
                Settings.AllowFileAccess = true;
                Settings.JavaScriptEnabled = true;
                HorizontalScrollBarEnabled = false;
                VerticalScrollBarEnabled = false;
                Settings.SetSupportZoom(true);
                Settings.JavaScriptCanOpenWindowsAutomatically = true;
            }
            public void OnReceiveValue(Java.Lang.Object value)
            {
                System.Console.WriteLine("Respone " + value);
            }
        }
        [Serializable]
        class JsonData
        {
            /// <summary>
            /// æ ‡é¢˜å†…容
            /// </summary>
            /// <value>The title.</value>
            [Newtonsoft.Json.JsonIgnore]
            public string Title
            {
                get
                {
                    return title["text"].ToString();
                }
                set
                {
                    title["text"] = value;
                }
            }
            [Newtonsoft.Json.JsonProperty]
            readonly Dictionary<string, object> title = new Dictionary<string, object> { ["text"] = "" };
            [Newtonsoft.Json.JsonProperty]
            readonly Dictionary<string, object> tooltip = new Dictionary<string, object> { ["trigger"] = "axis" };
            /// <summary>
            /// X轴坐标点
            /// </summary>
            /// <value>The XA rray.</value>
            [Newtonsoft.Json.JsonIgnore]
            public string[] XArray
            {
                get
                {
                    return (xAxis[0] as Dictionary<string, object>)["data"] as string[];
                }
                set
                {
                    (xAxis[0] as Dictionary<string, object>)["data"] = value;
                }
            }
            [Newtonsoft.Json.JsonProperty]
            readonly List<object> xAxis = new List<object> { new Dictionary<string, object> { ["type"] = "category", ["boundaryGap"] = false, ["data"] = new object[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 } } };
            [Newtonsoft.Json.JsonIgnore]
            public string Unit
            {
                get
                {
                    return ((yAxis[0] as Dictionary<string, object>)["axisLabel"] as Dictionary<string, object>)["formatter"].ToString().Substring("{value}".Length);
                }
                set
                {
                    ((yAxis[0] as Dictionary<string, object>)["axisLabel"] as Dictionary<string, object>)["formatter"] = "{value}" + value;
                }
            }
            [Newtonsoft.Json.JsonProperty]
            readonly List<object> yAxis = new List<object> { new Dictionary<string, object> { ["type"] = "value", ["axisLabel"] = new Dictionary<string, object> { ["formatter"] = "{value}" } } };
            /// <summary>
            /// Y轴坐标点
            /// </summary>
            /// <value>The YA rray.</value>
            [Newtonsoft.Json.JsonIgnore]
            public object[] YArray
            {
                get
                {
                    return (series[0] as Dictionary<string, object>)["data"] as object[];
                }
                set
                {
                    (series[0] as Dictionary<string, object>)["data"] = value;
                }
            }
            [Newtonsoft.Json.JsonProperty]
            readonly List<object> series = new List<object> { new Dictionary<string, object> { ["name"] = "Value", ["type"] = "line", ["data"] = new object[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, ["markPoint"] = new Dictionary<string, object> { ["data"] = new List<object> { new Dictionary<string, object> { ["type"] = "max", ["name"] = "Max" }, new Dictionary<string, object> { ["type"] = "min", ["name"] = "Min" } } }, ["markLine"] = new Dictionary<string, object> { ["data"] = new List<object> { new Dictionary<string, object> { ["type"] = "average", ["name"] = "Average" } } } } };
        }
    }
}
ZigbeeApp/Shared.Droid/UI/PageLayout.cs
New file
@@ -0,0 +1,801 @@
using System;
using Android.Views;
using Android.Content;
using Android.Widget;
using Android.Graphics.Drawables;
using static ViewFlow;
namespace Shared
{
    //已经全面检查了代码
    /// <summary>
    /// ä½ç½®å¸ƒå±€
    /// </summary>
    public class PageLayout : ViewGroup, ViewSwitchListener
    {
        /// <summary>
        /// è§†å›¾é«˜åº¦
        /// </summary>
        /// <value>The height.</value>
        public override int Height {
            get {
                return base.Height;
            }
            set {
                base.Height = value;
                if (!IsCanRefresh) {
                    return;
                }
                var layoutParameters = realViewGroup.LayoutParameters;
                layoutParameters.Height = Height;
                realViewGroup.LayoutParameters = layoutParameters;
            }
        }
        /// <summary>
        /// è§†å›¾å®½åº¦
        /// </summary>
        /// <value>The width.</value>
        public override int Width {
            get {
                return base.Width;
            }
            set {
                base.Width = value;
                if (!IsCanRefresh) {
                    return;
                }
                var layoutParameters = realViewGroup.LayoutParameters;
                layoutParameters.Width = Width;
                realViewGroup.LayoutParameters = layoutParameters;
            }
        }
        /// <summary>
        /// é¡µé¢å˜åŒ–事件
        /// </summary>
        public Action<PageLayout, int> PageChange;
        AndroidLinearLayout androidLinearLayout;
        /// <summary>
        /// æž„造函数
        /// </summary>
        public PageLayout ()
        {
            viewGroup = new AndroidFrameLayout (Application.Activity, null);
            realViewGroup = new ViewFlow (Application.Activity, this) { };
            (realViewGroup as ViewFlow).setOnViewSwitchListener (this);
            viewGroup.AddView (realViewGroup);
            androidLinearLayout = new AndroidLinearLayout (Application.Activity, this);
            androidLinearLayout.SetGravity (GravityFlags.Center);
            viewGroup.AddView (androidLinearLayout, new Android.Widget.FrameLayout.LayoutParams (Android.Widget.FrameLayout.LayoutParams.MatchParent, DensityUtil.Dip2Px (30), GravityFlags.Bottom));
        }
        /// <summary>
        ///  æ˜¯å¦æ˜¾ç¤ºä¸‹é¢ä¸€æŽ’的点
        /// </summary>
        /// <value><c>true</c> if is show point; otherwise, <c>false</c>.</value>
        public bool IsShowPoint {
            get {
                return androidLinearLayout.Visibility == ViewStates.Visible;
            }
            set {
                androidLinearLayout.Visibility = value ? ViewStates.Visible : ViewStates.Invisible;
            }
        }
        /// <summary>
        /// æ˜¯å¦å…è®¸æ»‘动
        /// </summary>
        /// <value><c>true</c> if scroll enabled; otherwise, <c>false</c>.</value>
        public bool ScrollEnabled {
            get {
                return (realViewGroup as ViewFlow).ScrollEnabled;
            }
            set {
                (realViewGroup as ViewFlow).ScrollEnabled = value;
            }
        }
        int pageIndex;
        /// <summary>
        /// è®¾ç½®æˆ–者获取当前的界面索引
        /// </summary>
        /// <value>The index of the page.</value>
        public int PageIndex {
            get {
                return (realViewGroup as ViewFlow).Position;
            }
            set
            {
                if (value < 0 || ChildrenCount < value)
                {
                    return;
                }
                int beforePageIndex = pageIndex;
                pageIndex = value;
                if (!IsCanRefresh)
                {
                    return;
                }
                (realViewGroup as ViewFlow).SetSelection(value);
            }
        }
        /// <summary>
        /// å¢žåŠ å­æŽ§ä»¶
        /// </summary>
        /// <param name="view">View.</param>
        public override void AddChidren (View view)
        {
            view.Parent = this;
            viewList.Add (view);
            var button = new Android.Widget.Button (Application.Activity);
            int roundRadius = DensityUtil.Dip2Px (5); // åœ†è§’半径
            var gd = new GradientDrawable ();//创建drawable
            if(viewList.Count==1){
                gd.SetColor(Android.Graphics.Color.GhostWhite);
            }else{
                gd.SetColor(Android.Graphics.Color.Gray);
            }
            gd.SetCornerRadius (roundRadius);
            button.Background = gd;
            var layoutParams = new Android.Widget.LinearLayout.LayoutParams (DensityUtil.Dip2Px (10), DensityUtil.Dip2Px (10));
            layoutParams.RightMargin = DensityUtil.Dip2Px (10);
            androidLinearLayout.AddView (button, layoutParams);
            realViewGroup.AddView (view.AndroidView);
            if (!IsCanRefresh) {
                return;
            }
            if (2 <= viewList.Count) {
                view.X = viewList [viewList.Count - 2].Right;
            }
            view.Refresh ();
            //如果父控件是这种,就在最后补上一个控件
            if (GetType () == typeof (VerticalScrolViewLayout)) {
                int tempHeight = -10;
                foreach (var temp in viewList) {
                    tempHeight += temp.Height;
                }
                realViewGroup.AddView (new Android.Widget.LinearLayout (Application.Activity) { Tag = "填充" }, new Android.Views.ViewGroup.LayoutParams (Android.Views.ViewGroup.LayoutParams.MatchParent, tempHeight < realViewGroup.LayoutParameters.Height ? realViewGroup.LayoutParameters.Height - tempHeight : 0));
            }
            if (view is ViewGroup) {
                var tempViewGroup = (ViewGroup)view;
                for (int i = 0; i < tempViewGroup.ChildrenCount; i++) {
                    tempViewGroup.GetChildren (i).Refresh ();
                }
            }
        }
        /// <summary>
        /// ç§»é™¤å½“前控件
        /// </summary>
        /// <param name="view">View.</param>
        internal override void Remove(View view)
        {
            if (view == null)
            {
                return;
            }
            int index = viewList.FindIndex(obj => obj == view);
            if (index < 0)
            {
                return;
            }
            viewList.Remove(view);
            androidLinearLayout.RemoveViewAt(index);
            realViewGroup.RemoveView(view.AndroidView);
            view.Parent = null;
            //new System.Threading.Thread(() =>
            //{
            //    Application.RunOnMainThread(() =>
            //            {
                            (realViewGroup as ViewFlow).SetSelection(PageIndex);
            //            });
            //})
            //{ IsBackground = true }.Start();
        }
        /// <summary>
        /// ç§»é™¤æ‰€æœ‰çš„æŽ§ä»¶
        /// </summary>
        public override void RemoveAll ()
        {
            while (0 < viewList.Count) {
                GetChildren(0)?.RemoveFromParent();
            }
            androidLinearLayout.RemoveAllViews ();
            (realViewGroup as ViewFlow).SetSelection(0);
        }
        /// <summary>
        /// æ ¹æ®ç´¢å¼•移除控件
        /// </summary>
        /// <param name="index">Index.</param>
        public override void RemoveAt (int index)
        {
            if (viewList.Count - 1 < index || index < 0) {
                return;
            }
            androidLinearLayout.RemoveViewAt (index);
            GetChildren(index)?.RemoveFromParent();
        }
        public void onSwitched (Android.Views.View realView, int pageIndex)
        {
            for (int i = 0; i < androidLinearLayout.ChildCount; i++) {
                var view = androidLinearLayout.GetChildAt (i);
                var gradientDrawable = (GradientDrawable)view.Background;//创建drawable
                if (i == pageIndex) {
                    gradientDrawable.SetColor (Android.Graphics.Color.GhostWhite);
                } else {
                    gradientDrawable.SetColor (Android.Graphics.Color.Gray);
                }
                view.Background = gradientDrawable;
            }
            if (PageChange != null && 0 <= pageIndex) {
                PageChange (this, pageIndex);
            }
        }
    }
}
public class ViewFlow : Android.Widget.FrameLayout
{
    public bool ScrollEnabled = true;
    static int snapVelocity = 1000;
    static int invalidScreen = -1;
    static int touchStateRest = 0;
    static int touchStateScrolling = 1;
    public int Position
    {
        get
        {
            return position;
        }
    }
    int position;
    Scroller scroller;
    VelocityTracker mVelocityTracker;
    int touchState = touchStateRest;
    float lastMotionX;
    float lastMotionY;
    int mTouchSlop;
    int mMaximumVelocity;
    int mCurrentScreen;
    ViewSwitchListener mViewSwitchListener;
    int mLastScrollDirection;
    int mNextScreen;
    /**
     * Receives call backs when a new {@link View} has been scrolled to.
     */
    public interface ViewSwitchListener
    {
        /**
         * This method is called when a new View has been scrolled to.
         *
         * @param view
         *            the {@link View} currently in focus.
         * @param position
         *            The position in the adapter of the {@link View} currently in focus.
         */
        void onSwitched(View view, int position);
    }
    Shared.PageLayout pageLayout;
    public ViewFlow(Context context, Shared.PageLayout view) : base(context)
    {
        pageLayout = view;
        init();
    }
    void init()
    {
        scroller = new Scroller(Context);
        var configuration = ViewConfiguration.Get(Context);
        //最小的滑动距离
        mTouchSlop = configuration.ScaledTouchSlop;
        mMaximumVelocity = configuration.ScaledMaximumFlingVelocity;
    }
    ViewFlow childViewFlow
    {
        get
        {
            if (0 < ChildCount)
            {
                var viewGroup = GetChildAt(ChildCount - 1);
            }
            return null;
        }
    }
    public override void RequestDisallowInterceptTouchEvent(bool disallowIntercept)
    {
        base.RequestDisallowInterceptTouchEvent(disallowIntercept);
        disallowInterceptTouchEvent = disallowIntercept;
    }
    bool disallowInterceptTouchEvent;
    bool isFirst;
    public override bool OnInterceptTouchEvent(MotionEvent ev)
    {
        if (disallowInterceptTouchEvent||IsDelay)
        {
            return false;
        }
        System.Console.WriteLine($"PageLayout->OnInterceptTouchEvent:{Height}   {ev.Action}");
        //如果没有子控件或者不允许滑动就返回,不处理当前事件
        if (ChildCount == 0 || !ScrollEnabled)
            return false;
        if (mVelocityTracker == null)
        {
            //初始化速度检测类
            mVelocityTracker = VelocityTracker.Obtain();
        }
        mVelocityTracker.AddMovement(ev);
        float x = ev.GetX();
        float y = ev.GetY();
        switch (ev.Action)
        {
            //每次点击都执行这里
            case MotionEventActions.Down:
                if (!scroller.IsFinished)
                {
                    scroller.AbortAnimation();
                    snapToDestination(false);
                }
                //记录点击的最新X坐标
                lastMotionX = x;
                lastMotionY = y;
                touchState = scroller.IsFinished ? touchStateRest : touchStateScrolling;
                break;
            //有子控件时执行这里
            case MotionEventActions.Move:
                var deltaX = (int)(lastMotionX - x);
                var deltaY = (int)(lastMotionY - y);
                //当前滑动是否已经超出了设定值
                var xMoved = Math.Abs(deltaX) > mTouchSlop ;
                if (xMoved && Math.Abs(deltaY) < Math.Abs(deltaX))
                {
                    if (!isFirst)
                    {
                        touchState = touchStateScrolling;
                    }
                    isFirst = false;
                }
                if (touchState == touchStateScrolling)
                {
                    //记录最新的坐标,因为接下来控件已经滑动了
                    lastMotionX = x;
                    int scrollX = ScrollX;
                    //向右滑动
                    if (deltaX < 0)
                    {
                        //之前已经滑动的Xè½´
                        if (scrollX > 0)
                        {
                            //向右滑动时显示出左边的界面,最低的长度为之前已经滑动的距离
                            ScrollBy(Math.Max(-scrollX, deltaX), 0);
                        }
                    }
                    //向左滑动
                    else if (deltaX > 0)
                    {
                        //最小的右边需要滑动的距离
                        int availableToScroll = GetChildAt(
                               ChildCount - 1).Right
                               - PaddingRight - HorizontalFadingEdgeLength
                               - scrollX - Width;
                        if (availableToScroll > 0)
                        {
                            ScrollBy(Math.Min(availableToScroll, deltaX), 0);
                        }
                    }
                    //当前事件自己处理了,子控制不需要处理当前这事件
                    return true;
                }
                break;
            case MotionEventActions.Up:
                if (touchState == touchStateScrolling)
                {
                    mVelocityTracker.ComputeCurrentVelocity(1000, mMaximumVelocity);
                    var velocityX = mVelocityTracker.XVelocity;
                    if (velocityX > snapVelocity && mCurrentScreen > 0)
                    {
                        // Fling hard enough to move left
                        snapToScreen(mCurrentScreen - 1);
                    }
                    else if (velocityX < -snapVelocity
                          && mCurrentScreen < ChildCount - 1)
                    {
                        // Fling hard enough to move right
                        snapToScreen(mCurrentScreen + 1);
                    }
                    else
                    {
                        snapToDestination();
                    }
                    if (mVelocityTracker != null)
                    {
                        mVelocityTracker.Recycle();
                        mVelocityTracker = null;
                    }
                }
                touchState = touchStateRest;
                break;
            case MotionEventActions.Cancel:
                touchState = touchStateRest;
                break;
        }
        return false;
    }
    public bool IsDelay;
    public override bool OnTouchEvent(MotionEvent e)
    {
        if (IsDelay || disallowInterceptTouchEvent)
        {
            return false;
        }
        System.Console.WriteLine($"PageLayout->OnTouchEvent:{Height}   {e.Action}");
        if (ChildCount == 0 || !ScrollEnabled)
            return false;
        if (mVelocityTracker == null)
        {
            mVelocityTracker = VelocityTracker.Obtain();
        }
        mVelocityTracker.AddMovement(e);
        var x = e.GetX();
        var y = e.GetY();
        switch (e.Action)
        {
            case MotionEventActions.Down:
                if (!scroller.IsFinished)
                {
                    scroller.AbortAnimation();
                    snapToDestination(false);
                }
                lastMotionX = x;
                lastMotionY = y;
                touchState = scroller.IsFinished ? touchStateRest
                        : touchStateScrolling;
                break;
            case MotionEventActions.Move:
                var deltaX = (int)(lastMotionX - x);
                var deltaY = (int)(lastMotionY - y);
                //当前滑动是否已经超出了设定值
                var xMoved = Math.Abs(deltaX) > mTouchSlop;
                if (xMoved && Math.Abs(deltaY) < Math.Abs(deltaX))
                {
                    if (!isFirst)
                    {
                        touchState = touchStateScrolling;
                    }
                    isFirst = false;
                }
                if (touchState == touchStateScrolling)
                {
                    lastMotionX = x;
                    int scrollX = ScrollX;
                    if (deltaX < 0)
                    {
                        if (scrollX > 0)
                        {
                            ScrollBy(Math.Max(-scrollX, deltaX), 0);
                        }
                    }
                    else if (deltaX > 0)
                    {
                        int availableToScroll = GetChildAt(
                               ChildCount - 1).Right
                               - PaddingRight - HorizontalFadingEdgeLength
                                              - scrollX - screenWidth;
                        if (availableToScroll > 0)
                        {
                            ScrollBy(Math.Min(availableToScroll, deltaX), 0);
                        }
                    }
                    return true;
                }
                break;
            case MotionEventActions.Up:
                if (touchState == touchStateScrolling)
                {
                    mVelocityTracker.ComputeCurrentVelocity(1000, mMaximumVelocity);
                    var velocityX = mVelocityTracker.XVelocity;
                    if (velocityX > snapVelocity && mCurrentScreen > 0)
                    {
                        // Fling hard enough to move left
                        snapToScreen(mCurrentScreen - 1);
                    }
                    else if (velocityX < -snapVelocity
                          && mCurrentScreen < ChildCount - 1)
                    {
                        // Fling hard enough to move right
                        snapToScreen(mCurrentScreen + 1);
                    }
                    else
                    {
                        snapToDestination();
                    }
                    if (mVelocityTracker != null)
                    {
                        mVelocityTracker.Recycle();
                        mVelocityTracker = null;
                    }
                }
                touchState = touchStateRest;
                break;
            case MotionEventActions.Cancel:
                snapToDestination();
                touchState = touchStateRest;
                break;
        }
        return true;
    }
    /// <summary>
    /// å­æŽ§ä»¶çš„宽度
    /// </summary>
    /// <value>The width of the child.</value>
    int screenWidth
    {
        get
        {
            return MeasuredWidth;
        }
    }
    /// <summary>
    /// æ»‘动到指定的界面
    /// </summary>
    void snapToDestination(bool isDelay=true)
    {
        int whichScreen = (ScrollX + (screenWidth / 2)) / screenWidth;
        snapToScreen(whichScreen,isDelay);
    }
    /// <summary>
    /// æ»‘动到指定界面
    /// </summary>
    /// <param name="whichScreen">Which screen.</param>
    void snapToScreen(int whichScreen,bool isDelay=true)
    {
        mLastScrollDirection = whichScreen - mCurrentScreen;
        if (!scroller.IsFinished)
            return;
        whichScreen = Math.Max(0, Math.Min(whichScreen, ChildCount - 1));
        System.Console.WriteLine($"snapToScreen:{whichScreen}");
        mNextScreen = whichScreen;
        int newX = whichScreen * screenWidth;
        int delta = newX - ScrollX;
        scroller.StartScroll(ScrollX, 0, delta, 0, isDelay ? Math.Abs(delta) * 2 : 0);
        Invalidate();
    }
    public override void ComputeScroll()
    {
        if (scroller.ComputeScrollOffset())
        {
            ScrollTo(scroller.CurrX, scroller.CurrY);
            PostInvalidate();
        }
        else if (mNextScreen != invalidScreen)
        {
            mCurrentScreen = Math.Max(0, Math.Min(mNextScreen, ChildCount - 1));
            mNextScreen = invalidScreen;
            postViewSwitched(mLastScrollDirection);
        }
    }
    /**
     * Scroll to the {@link View} in the view buffer specified by the index.
     *
     * @param indexInBuffer
     *            Index of the view in the view buffer.
     */
    void setVisibleView(int indexInBuffer, bool uiThread)
    {
        mCurrentScreen = Math.Max(0, Math.Min(indexInBuffer, ChildCount - 1));
        int dx = (mCurrentScreen * screenWidth) - scroller.CurrX;
        scroller.StartScroll(scroller.CurrX, scroller.CurrY, dx,0, 0);
        if (dx == 0)
            OnScrollChanged(scroller.CurrX + dx, scroller.CurrY, scroller.CurrX + dx, scroller.CurrY);
        if (uiThread)
            Invalidate();
        else
            PostInvalidate();
    }
    /**
     * Set the listener that will receive notifications every time the {code
     * ViewFlow} scrolls.
     *
     * @param l
     *            the scroll listener
     */
    public void setOnViewSwitchListener(ViewSwitchListener l)
    {
        mViewSwitchListener = l;
    }
    public void SetSelection(int position)
    {
        mNextScreen = invalidScreen;
        scroller.ForceFinished(true);
        var beforePosition = this.position;
        position = Math.Max(position, 0);
        position = Math.Min(position, ChildCount - 1);
        if (position < 0)
        {
            return;
        }
        var currentView = GetChildAt(position);
        this.position = position;
        setVisibleView(this.position, true);
        RequestLayout();
        if (mViewSwitchListener != null && beforePosition != this.position)
        {
            mViewSwitchListener.onSwitched(currentView, this.position);
        }
    }
    void postViewSwitched(int direction)
    {
        if (direction == 0)
            return;
        var beforePosition = position;
        if (direction > 0)
        { // to the right
            position++;
            position = Math.Min(position, ChildCount - 1);
        }
        else
        { // to the left
            position--;
            position = Math.Max(position, 0);
        }
        setVisibleView(position, true);
        RequestLayout();
        if (mViewSwitchListener != null && beforePosition != position)
        {
            mViewSwitchListener.onSwitched(GetChildAt(position),position);
        }
    }
    bool isHaveSameTypeParent
    {
        get
        {
            var parent = Parent;
            while (parent != null)
            {
                if (parent is ViewFlow)
                {
                    return true;
                }
                parent = parent.Parent;
            }
            return false;
        }
    }
    public override bool DispatchTouchEvent(MotionEvent e)
    {
        //System.Console.WriteLine($"PageLayout->DispatchTouchEvent:{Height}   {e.Action}");
        if(e.Action== MotionEventActions.Down) {
            //还原中断
            RequestDisallowInterceptTouchEvent(false);
            isFirst = true;
            IsDelay = false;
        }
        if (isHaveSameTypeParent && !isScrolledToBottom)
        {
            //如果父控件和当前控件一样,并且没有滑动到底也没有da
            Parent.RequestDisallowInterceptTouchEvent(true);
        }
        else
        {
            isScrolledToBottom = false;
            Parent.RequestDisallowInterceptTouchEvent(false);
        }
        return base.DispatchTouchEvent(e);
    }
    private bool isScrolledToTop = true;  // åˆå§‹åŒ–的时候设置一下值
    private bool isScrolledToBottom;
    protected override void OnOverScrolled(int scrollX, int scrollY, bool clampedX, bool clampedY)
    {
        base.OnOverScrolled(scrollX, scrollY, clampedX, clampedY);
        if (scrollY == 0)
        {
            isScrolledToTop = clampedY;
            isScrolledToBottom = false;
        }
        else
        {
            isScrolledToTop = false;
            isScrolledToBottom = clampedY;
        }
    }
    protected override void OnScrollChanged(int l, int t, int oldl, int oldt)
    {
        base.OnScrollChanged(l, t, oldl, oldt);
        if ((int)Android.OS.Build.VERSION.SdkInt < 9)
        {  // API 9及之后走onOverScrolled方法监听
            if (ScrollY == 0)
            {    // å°å¿ƒè¸©å‘1: è¿™é‡Œä¸èƒ½æ˜¯getScrollY() <= 0
                isScrolledToTop = true;
                isScrolledToBottom = false;
            }
            else if (ScrollY + Height - PaddingTop - PaddingBottom == (0 < ChildCount ? GetChildAt(0).Height : Height))
            {
                // å°å¿ƒè¸©å‘2: è¿™é‡Œä¸èƒ½æ˜¯ >=
                // å°å¿ƒè¸©å‘3(可能忽视的细节2):这里最容易忽视的就是ScrollView上下的padding 
                isScrolledToBottom = true;
                isScrolledToTop = false;
            }
            else
            {
                isScrolledToTop = false;
                isScrolledToBottom = false;
            }
        }
        // æœ‰æ—¶å€™å†™ä»£ç ä¹ æƒ¯äº†ï¼Œä¸ºäº†å…¼å®¹ä¸€äº›è¾¹ç•Œå¥‡è‘©æƒ…况,上面的代码就会写成<=,>=的情况,结果就出bug了
        // æˆ‘写的时候写成这样:getScrollY() + getHeight() >= getChildAt(0).getHeight()
        // ç»“果发现快滑动到底部但是还没到时,会发现上面的条件成立了,导致判断错误
        // åŽŸå› ï¼šgetScrollY()值不是绝对靠谱的,它会超过边界值,但是它自己会恢复正确,导致上面的计算条件不成立
        // ä»”细想想也感觉想得通,系统的ScrollView在处理滚动的时候动态计算那个scrollY的时候也会出现超过边界再修正的情况
    }
}
ZigbeeApp/Shared.Droid/UI/PickerView.cs
New file
@@ -0,0 +1,241 @@
using System;
using System.Collections.Generic;
using Com.Hdl.Widget.Pickerview.Builder;
using Com.Hdl.Widget.Pickerview.Listener;
using Android.Content;
namespace Shared
{
    public class PickerView
    {
        //public static void Show(List<KeyValuePair<string, string[]>> list, Action<string> action, string sure = "Sure", string beforeValue = "")
        //{
        //    if (list == null) {
        //        return;
        //    }
        //    var pv = new Shared.Droid.TCL.PickerView();
        //    pv.Show(Application.Activity, list, (obj) => {
        //        action?.Invoke(obj);
        //    });
        //}
        /// <summary>
        /// ä¸€çº§æ•°ç»„弹窗 æ”¯æŒè®¾ç½®é»˜è®¤é€‰ä¸­ç´¢å¼•,自定义标题,确认按钮,取消按钮字符
        /// </summary>
        public static void Show(List<string> mList, Action<int> action, int mSelectIndex1 = 0, string title = "", string sure = "确认", string cancel = "取消")
        {
            if (mList == null)
            {
                return;
            }
            var mOptionsPickerBuilder = new OptionsPickerBuilder(Application.Activity, new OnOptionsSelectListenerCallBack(action))
                .SetTitleText(title)
                .SetSubmitText(sure)
                .SetCancelText(cancel)
                .SetContentTextSize(20)//设置滚轮文字大小
                .SetSelectOptions(mSelectIndex1)
                //.SetDividerColor(BLACK)//设置分割线的颜色
                //.SetSelectOptions(0, 1)//默认选中项
                //.SetBgColor(BLACK)
                //.SetTitleBgColor(BLACK)
                //.SetTitleColor(BLACK)
                //.SetCancelColor(BLACK)
                //.SetSubmitColor(BLACK)
                //.SetTextColorCenter(BLACK)
                .IsRestoreItem(true)//切换时是否还原,设置默认选中第一项。
                .IsCenterLabel(false) //是否只显示中间选中项的label文字,false则每项item全部都带有label。
                                      //.SetLabels("省", "市", "区")
                .SetOutSideColor(0x00000000) //设置外部遮罩颜色
                .Build();
            mOptionsPickerBuilder.SetPicker(mList);
            mOptionsPickerBuilder.Show();
        }
        private static string SPLIT_FLAG = ">-<";
        /// <summary>
        /// äºŒçº§è”动弹窗 æ”¯æŒè®¾ç½®é»˜è®¤é€‰ä¸­ç´¢å¼•,自定义标题,确认按钮,取消按钮字符
        /// </summary>
        public static void ShowSecondary(List<string> mFirstList, List<List<string>> mSecondList, Action<int, int> action, int mSelectIndex1 = 0, int mSelectIndex2 = 0, string title = "", string sure = "确认", string cancel = "取消")
        {
            if (mFirstList == null)
            {
                return;
            }
            if (mFirstList.Count != mSecondList.Count)
            {
                return;
            }
            var mSpliceList = new List<string>();//拼接后的数组
            for (int i = 0; i < mSecondList.Count; i++)
            {
                string mDataStr = "";
                for (int j = 0; j < mSecondList[i].Count; j++)
                {
                    mDataStr += mSecondList[i][j] + SPLIT_FLAG;
                }
                mSpliceList.Add(mDataStr);
            }
            var mOptionsPickerBuilder = new OptionsPickerBuilder(Application.Activity, new OnSecondaryOptionsSelectListenerCallBack(action))
                .SetTitleText(title)
                .SetSubmitText(sure)
                .SetCancelText(cancel)
                .SetContentTextSize(20)//设置滚轮文字大小
                .SetSelectOptions(mSelectIndex1, mSelectIndex2)
                //.SetDividerColor(BLACK)//设置分割线的颜色
                //.SetSelectOptions(0, 1)//默认选中项
                //.SetBgColor(BLACK)
                //.SetTitleBgColor(BLACK)
                //.SetTitleColor(BLACK)
                //.SetCancelColor(BLACK)
                //.SetSubmitColor(BLACK)
                //.SetTextColorCenter(BLACK)
                .IsRestoreItem(true)//切换时是否还原,设置默认选中第一项。
                .IsCenterLabel(false) //是否只显示中间选中项的label文字,false则每项item全部都带有label。
                                      //.SetLabels("省", "市", "区")
                .SetOutSideColor(0x00000000) //设置外部遮罩颜色
                .Build();
            mOptionsPickerBuilder.SetPickerString(mFirstList, mSpliceList);
            mOptionsPickerBuilder.Show();
        }
        /// <summary>
        /// ä¸è”动支持自定义标题,确认按钮,取消按钮文字
        /// </summary>
        public static void ShowNormal(List<string> mFirstList, List<string> mSecondList, List<string> mThirdList, Action<int, int, int> action, int mSelectIndex1 = 0, int mSelectIndex2 = 0, int mSelectIndex3 = 0, string title = "", string sure = "确认", string cancel = "取消")
        {
            if (mFirstList == null)
            {
                return;
            }
            if (mSecondList == null)
            {
                return;
            }
            var mOptionsPickerBuilder = new OptionsPickerBuilder(Application.Activity, new OnOptionsSelectListenerCallBack3(action))
            .SetTitleText(title)
            .SetSubmitText(sure)
            .SetCancelText(cancel)
            .SetContentTextSize(20)//设置滚轮文字大小
            .SetSelectOptions(mSelectIndex1, mSelectIndex2, mSelectIndex3)
            //.SetDividerColor(BLACK)//设置分割线的颜色
            //.SetSelectOptions(0, 1)//默认选中项
            //.SetBgColor(BLACK)
            //.SetTitleBgColor(BLACK)
            //.SetTitleColor(BLACK)
            //.SetCancelColor(BLACK)
            //.SetSubmitColor(BLACK)
            //.SetTextColorCenter(BLACK)
            .IsRestoreItem(true)//切换时是否还原,设置默认选中第一项。
            .IsCenterLabel(false) //是否只显示中间选中项的label文字,false则每项item全部都带有label。
                          //.SetLabels("省", "市", "区")
            .SetOutSideColor(0x00000000) //设置外部遮罩颜色
            .Build();
            mOptionsPickerBuilder.SetNPicker(mFirstList, mSecondList, mThirdList);
            mOptionsPickerBuilder.Show();
        }
        /// <summary>
        /// ä¸€çº§å›žè°ƒäº‹ä»¶
        /// </summary>
        public class OnOptionsSelectListenerCallBack : Java.Lang.Object, IOnOptionsSelectListener
        {
            Action<int> mAction;
            public OnOptionsSelectListenerCallBack(Action<int> action)
            {
                mAction = action;
            }
            public void OnOptionsSelect(int selectIndex1, int selectIndex2, int selectIndex3, Android.Views.View p3)
            {
                //System.Console.WriteLine("OnOptionsSelect: selectIndex1:" + selectIndex1 + "  selectIndex2:" + selectIndex2);
                mAction?.Invoke(selectIndex1);
            }
        }
        /// <summary>
        /// äºŒçº§è”动回调事件
        /// </summary>
        public class OnSecondaryOptionsSelectListenerCallBack : Java.Lang.Object, IOnOptionsSelectListener
        {
            Action<int, int> mActionSecondary;
            public OnSecondaryOptionsSelectListenerCallBack(Action<int, int> action)
            {
                mActionSecondary = action;
            }
            public void OnOptionsSelect(int selectIndex1, int selectIndex2, int selectIndex3, Android.Views.View p3)
            {
                //System.Console.WriteLine("OnOptionsSelect: selectIndex1:" + selectIndex1 + "  selectIndex2:" + selectIndex2);
                mActionSecondary?.Invoke(selectIndex1, selectIndex2);
            }
        }
        /// <summary>
        /// ä¸‰çº§å›žè°ƒäº‹ä»¶
        /// </summary>
        public class OnOptionsSelectListenerCallBack3 : Java.Lang.Object, IOnOptionsSelectListener
        {
            Action<int, int , int> mAction;
            public OnOptionsSelectListenerCallBack3(Action<int, int, int> action)
            {
                mAction = action;
            }
            public void OnOptionsSelect(int selectIndex1, int selectIndex2, int selectIndex3, Android.Views.View p3)
            {
                //System.Console.WriteLine("OnOptionsSelect: selectIndex1:" + selectIndex1 + "  selectIndex2:" + selectIndex2);
                mAction?.Invoke(selectIndex1, selectIndex2, selectIndex3);
            }
        }
    }
}
ZigbeeApp/Shared.Droid/UI/QRCode.cs
New file
@@ -0,0 +1,61 @@
using System;
using System.Drawing;
using System.IO;
//namespace Shared
//{
//    public static class QRCode
//    {
//        static ZXing.Mobile.MobileBarcodeScanner scanner;
//        public static void  ScanQRcode(Action<string> action)
//        {
//            ((BaseActivity)Shared.Application.Activity).SetCamera(async (obj) => {
//                if (obj)
//                {
//                    if (scanner == null)
//                    {
//                        MobileBarcodeScanner.Initialize(Shared.Application.Activity.Application);
//                        scanner = new ZXing.Mobile.MobileBarcodeScanner();
//                    }
//                    var result = await scanner.Scan();
//                    if (result != null)
//                        action?.Invoke(result.Text);
//                    else
//                        action?.Invoke(null);
//                }
//                else {
//                    action?.Invoke(null);
//                }
//            });
//        }
//        public static byte[] BytesFromText(string text, int width = 300, int height = 300)
//        {
//            var barcodeWriter = new ZXing.Mobile.BarcodeWriter
//            {
//                Format = ZXing.BarcodeFormat.QR_CODE,
//                Options = new ZXing.Common.EncodingOptions
//                {
//                    Width = width,
//                    Height = height,
//                    Margin = 10
//                }
//            };
//            barcodeWriter.Renderer = new ZXing.Mobile.BitmapRenderer();
//            var bitmap = barcodeWriter.Write(text);
//            using (var stream = new MemoryStream())
//            {
//                bitmap.Compress(Android.Graphics.Bitmap.CompressFormat.Png, 100, stream);  // this is the diff between iOS and Android
//                stream.Position = 0;
//                return stream.ToArray();
//            }
//        }
//    }
//}
ZigbeeApp/Shared.Droid/UI/RowLayout.cs
New file
@@ -0,0 +1,397 @@
using System;
using Android.Content;
using Android.Views;
using Android.Util;
using Android.Runtime;
using Android.Widget;
using Android.OS;
using Android.Views.Animations;
namespace Shared
{
    //已经全面检查了代码
    /// <summary>
    /// åœ¨æ»‘动事件下,可显示隐藏些自定义视图
    /// </summary>
    public class RowLayout : ViewGroup
    {
        AndroidRowLayout androidRowLayout;
        uint lineColor = 0x62818181;
        /// <summary>
        /// èƒŒæ™¯é¢œè‰²
        /// </summary>
        /// <value>The color of the background.</value>
        public virtual uint LineColor
        {
            get
            {
                return lineColor;
            }
            set
            {
                lineColor = value;
                byte r, g, b, a;
                r = (byte)(lineColor / 256 / 256 % 256);
                g = (byte)(lineColor / 256 % 256);
                b = (byte)(lineColor % 256);
                a = (byte)(lineColor / 256 / 256 / 256 % 256);
                lineLinearLayout.SetBackgroundColor(Android.Graphics.Color.Argb(a, r, g, b));
            }
        }
        /// <summary>
        /// å®½åº¦è®¾ç½®æˆ–读取
        /// </summary>
        /// <value>The width.</value>
        public override int Width
        {
            get
            {
                return base.Width;
            }
            set
            {
                base.Width = value;
                if (!IsCanRefresh)
                {
                    return;
                }
                var layoutParameters = androidRowLayout.LayoutParameters;
                layoutParameters.Width = Width;
                androidRowLayout.LayoutParameters = layoutParameters;
            }
        }
        /// <summary>
        /// è§†å›¾é«˜åº¦
        /// </summary>
        /// <value>The height.</value>
        public override int Height
        {
            get
            {
                return base.Height;
            }
            set
            {
                base.Height = value;
                if (!IsCanRefresh)
                {
                    return;
                }
                var layoutParameters = androidRowLayout.LayoutParameters;
                layoutParameters.Height = Height;
                androidRowLayout.LayoutParameters = layoutParameters;
            }
        }
        Android.Widget.LinearLayout leftLinarLayout;
        Android.Widget.LinearLayout rightLinarLayout;
        Android.Widget.LinearLayout lineLinearLayout;
        /// <summary>
        /// åœ¨æ»‘动事件下,可显示隐藏些自定义视图
        /// </summary>
        public RowLayout()
        {
            viewGroup = new Android.Widget.FrameLayout(Application.Activity);
            androidRowLayout = new AndroidRowLayout(Application.Activity, this) { };
            androidRowLayout.RightToLeftAction += () =>
            {
                openRightMenu();
            };
            androidRowLayout.LeftToRightAction += () =>
            {
                openLeftMenu();
            };
            realViewGroup = androidRowLayout;
            leftLinarLayout = new Android.Widget.LinearLayout(Application.Activity) { Orientation = Android.Widget.Orientation.Horizontal, Alpha = 0.0f };
            rightLinarLayout = new Android.Widget.LinearLayout(Application.Activity) { Orientation = Android.Widget.Orientation.Horizontal, Alpha = 0.0f };
            lineLinearLayout = new Android.Widget.LinearLayout(Application.Activity);
            LineColor = lineColor;
            viewGroup.AddView(leftLinarLayout, new Android.Views.ViewGroup.LayoutParams(Android.Views.ViewGroup.LayoutParams.WrapContent, Android.Views.ViewGroup.LayoutParams.MatchParent));
            viewGroup.AddView(rightLinarLayout, new Android.Views.ViewGroup.LayoutParams(Android.Views.ViewGroup.LayoutParams.WrapContent, Android.Views.ViewGroup.LayoutParams.MatchParent));
            viewGroup.AddView(androidRowLayout, new Android.Views.ViewGroup.LayoutParams(Android.Views.ViewGroup.LayoutParams.MatchParent, Android.Views.ViewGroup.LayoutParams.MatchParent));
            viewGroup.AddView(lineLinearLayout, new Android.Widget.FrameLayout.LayoutParams(Android.Views.ViewGroup.LayoutParams.MatchParent, DensityUtil.Dip2Px(1), Android.Views.GravityFlags.Bottom));
        }
        void openLeftMenu()
        {
            if (androidRowLayout.isShowRight)
            {
                hideRightMenu();
                return;
            }
            if (leftLinarLayout.ChildCount == 0)
                return;
            androidRowLayout.isShowLeft = true;
            Android.Widget.FrameLayout.LayoutParams lp = (Android.Widget.FrameLayout.LayoutParams)androidRowLayout.LayoutParameters;
            lp.LeftMargin = leftLinarLayout.LayoutParameters.Width;
            androidRowLayout.LayoutParameters = lp;
            leftLinarLayout.Alpha = 1.0f;
            if (leftLinarLayout.Animation == null)
            {
                leftLinarLayout.Animation = new TranslateAnimation(
                    Dimension.RelativeToSelf, 0.1f,
                    Dimension.RelativeToSelf, 0,
                    Dimension.RelativeToSelf, 0,
                    Dimension.RelativeToSelf, 0);
                leftLinarLayout.Animation.Duration = 200;
            }
            //   Animation = leftUIView.Animation;
            //Animation.Reset();
            //Animation.StartNow();
            leftLinarLayout.Animation.Reset();
            leftLinarLayout.Animation.StartNow();
            //            UIView.Animate (0.2f, 0.0f, UIViewAnimationOptions.BeginFromCurrentState, () => {
            //                contentView.X = (int)leftUIView.Frame.Width;
            //                leftUIView.Alpha = 1.0f;
            //            }, () => {
            //
            //            });
        }
        void hideLeftMenu()
        {
            androidRowLayout.isShowLeft = false;
            Android.Widget.FrameLayout.LayoutParams lp = (Android.Widget.FrameLayout.LayoutParams)androidRowLayout.LayoutParameters;
            lp.LeftMargin = 0;
            androidRowLayout.LayoutParameters = lp;
            leftLinarLayout.Alpha = 0.0f;
            //            UIView.Animate(0.2f,0.0f,UIViewAnimationOptions.BeginFromCurrentState,()=>{
            //                contentView.X=0;
            //                leftUIView.Alpha=0.0f;
            //            },()=>{
            //
            //            });
        }
        void openRightMenu()
        {
            if (androidRowLayout.isShowLeft)
            {
                hideLeftMenu();
                return;
            }
            if (rightLinarLayout.ChildCount == 0)
                return;
            androidRowLayout.isShowRight = true;
            Android.Widget.FrameLayout.LayoutParams lp = (Android.Widget.FrameLayout.LayoutParams)androidRowLayout.LayoutParameters;
            lp.LeftMargin = -rightLinarLayout.LayoutParameters.Width;
            androidRowLayout.LayoutParameters = lp;
            rightLinarLayout.Alpha = 1.0f;
            if (rightLinarLayout.Animation == null)
            {
                rightLinarLayout.Animation = new TranslateAnimation(
                        Dimension.RelativeToSelf, -0.1f,
                        Dimension.RelativeToSelf, 0.0f,
                        Dimension.RelativeToSelf, 0,
                        Dimension.RelativeToSelf, 0);
                rightLinarLayout.Animation.Duration = 200;
            }
            //Animation = rightUIView.Animation;
            //Animation.Reset();
            //Animation.StartNow();
            rightLinarLayout.Animation.Reset();
            rightLinarLayout.Animation.StartNow();
        }
        void hideRightMenu()
        {
            androidRowLayout.isShowRight = false;
            Android.Widget.FrameLayout.LayoutParams lp = (Android.Widget.FrameLayout.LayoutParams)androidRowLayout.LayoutParameters;
            lp.LeftMargin = 0;
            androidRowLayout.LayoutParameters = lp;
            rightLinarLayout.Alpha = 0.0f;
        }
        /// <summary>
        /// å­è§†å›¾çš„宽度
        /// </summary>
        int subViewWidth = 100;
        /// <summary>
        /// å¢žåŠ å·¦è¾¹è§†å›¾
        /// </summary>
        /// <param name="view">View.</param>
        public void AddLeftView(View view)
        {
            leftLinarLayout.AddView(view.AndroidView, new Android.Views.ViewGroup.LayoutParams(DensityUtil.Dip2Px(subViewWidth), androidRowLayout.LayoutParameters.Height));
            leftLinarLayout.LayoutParameters.Width = leftLinarLayout.ChildCount * DensityUtil.Dip2Px(subViewWidth);
            view.Parent = this;
            view.Width = DensityUtil.Dip2Px(subViewWidth);
            view.Height = androidRowLayout.LayoutParameters.Height;
        }
        /// <summary>
        /// å¢žåŠ å³è¾¹è§†å›¾
        /// </summary>
        /// <param name="view">View.</param>
        public void AddRightView(View view)
        {
            rightLinarLayout.AddView(view.AndroidView, new Android.Views.ViewGroup.LayoutParams(DensityUtil.Dip2Px(subViewWidth), androidRowLayout.LayoutParameters.Height));
            rightLinarLayout.LayoutParameters.Width = rightLinarLayout.ChildCount * DensityUtil.Dip2Px(subViewWidth);
            ((Android.Widget.FrameLayout.LayoutParams)rightLinarLayout.LayoutParameters).LeftMargin = androidRowLayout.LayoutParameters.Width - rightLinarLayout.LayoutParameters.Width;
            view.Parent = this;
            view.Width = DensityUtil.Dip2Px(subViewWidth);
            view.Height = androidRowLayout.LayoutParameters.Height;
        }
        class AndroidRowLayout : Android.Widget.FrameLayout
        {
            View _view;
            int mTouchSlop
            {
                get
                {
                    var configuration = ViewConfiguration.Get(Context);
                    //最小的滑动距离
                    return configuration.ScaledTouchSlop;
                }
            }
            public AndroidRowLayout(Context context, View view)
                : base(context)
            {
                _view = view;
            }
            float mLastX, mLastY;
            internal bool isShowLeft;
            internal bool isShowRight;
            public Action RightToLeftAction;
            public Action LeftToRightAction;
            bool isActioned;
            bool action(MotionEvent e)
            {
                switch (e.Action)
                {
                    case MotionEventActions.Down:
                        //记录点击的最新X坐标
                        mLastX = e.RawX;
                        mLastY = e.RawY;
                        Parent?.RequestDisallowInterceptTouchEvent(true);
                        break;
                    case MotionEventActions.Move:
                        var x = e.RawX;
                        var y = e.RawY;
                        var deltaX = x - mLastX;
                        var deltaY = y - mLastY;
                        if (Math.Abs(deltaY) < Math.Abs(deltaX))
                        {
                            if (!isActioned)
                            {
                                //RightToLeftAction
                                if (deltaX < -mTouchSlop)
                                {
                                    isActioned = true;
                                    //parentDelay(true);
                                    //System.Console.WriteLine("RowLayout:DispatchTouchEvent:RightToLeft");
                                    RightToLeftAction?.Invoke();
                                }
                                //LeftToRightAction
                                if (mTouchSlop < deltaX)
                                {
                                    isActioned = true;
                                    //parentDelay(true);
                                    //System.Console.WriteLine("RowLayout:DispatchTouchEvent:LeftToRight");
                                    LeftToRightAction?.Invoke();
                                }
                            }
                            return true;
                        }
                        else
                        {
                            //上下滑动时,允许父控件的拦截
                            if (4 < Math.Abs(deltaY))
                            {
                                Parent?.RequestDisallowInterceptTouchEvent(false);
                            }
                        }
                        break;
                }
                return false;
            }
            /// <summary>
            /// æ‰§è¡ŒOnInterceptTouchEvent和OnTouchEvent
            /// </summary>
            /// <returns><c>true</c>事件已经处理<c>false</c>事件没有处理</returns>
            /// <param name="e">E.</param>
            public override bool DispatchTouchEvent(MotionEvent e)
            {
                System.Console.WriteLine($"{GetType()} Height->{Height} Width->{Width} DispatchTouchEvent->{e.Action}");
                if (e.Action == MotionEventActions.Down)
                {
                    isActioned = false;
                    //还原允许拦截事件
                    RequestDisallowInterceptTouchEvent(false);
                }
                return base.DispatchTouchEvent(e);
            }
            public override bool OnInterceptTouchEvent(MotionEvent e)
            {
                System.Console.WriteLine($"{GetType()} Height->{Height} Width->{Width} OnInterceptTouchEvent->{e.Action}");
                if (disallowIntercept)
                {
                    return false;
                }
                if (action(e))
                {
                    return true;
                }
                return base.OnInterceptTouchEvent(e);
            }
            /// <summary>
            /// é‡å†™ç‚¹å‡»äº‹ä»¶
            /// </summary>
            /// <returns><c>true</c>, if touch event was oned, <c>false</c> otherwise.</returns>
            /// <param name="e">E.</param>
            public override bool OnTouchEvent(MotionEvent e)
            {
                System.Console.WriteLine($"{GetType()} Height->{Height} Width->{Width} OnTouchEvent->{e.Action}");
                if (!isActioned)
                {
                    _view.TouchEvent(e);
                }
                action(e);
                return true;
            }
            bool disallowIntercept;
            public override void RequestDisallowInterceptTouchEvent(bool disallowIntercept)
            {
                this.disallowIntercept = disallowIntercept;
                System.Console.WriteLine($"{GetType()} Height->{Height} RequestDisallowInterceptTouchEvent->{disallowIntercept}");
                base.RequestDisallowInterceptTouchEvent(disallowIntercept);
                Parent?.RequestDisallowInterceptTouchEvent(disallowIntercept);
            }
        }
    }
}
ZigbeeApp/Shared.Droid/UI/Spinner.cs
New file
@@ -0,0 +1,178 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Android.App;
using Android.Content;
using Android.OS;
using Android.Runtime;
using Android.Views;
using Android.Widget;
using Android.Util;
using Android.Views.Animations;
namespace Shared
{
    /// <summary>
    /// å½“前视图
    /// </summary>
    public class Spinner : Button
    {
        public Spinner()
        {
            TextColor = 0xff007aff;
            Radius = 10;
            BorderWidth = (uint)DensityUtil.Dip2Px(1);
            MouseUpEventHandler += (sender, e) =>
            {
                if (AdapterStr == null || AdapterStr.Length == 0)
                {
                    return;
                }
                ScrollView tempScrolView = new ScrollView(Application.Activity);
                tempScrolView.VerticalScrollBarEnabled = false;
                Application.RootFrameLayout.AddView(tempScrolView, new Android.Views.ViewGroup.LayoutParams(Application.CurrentWidth, Application.CurrentHeight));
                tempScrolView.BringToFront();
                tempScrolView.Alpha = 0.94f;
                Android.Widget.LinearLayout linearLayout = new Android.Widget.LinearLayout(Application.Activity);
                linearLayout.Orientation = Orientation.Vertical;
                tempScrolView.AddView(linearLayout, new Android.Views.ViewGroup.LayoutParams(tempScrolView.LayoutParameters.Width, Android.Views.ViewGroup.LayoutParams.WrapContent));
                int height = 40;
                int totalHeight = AdapterStr.Length * DensityUtil.Dip2Px(height + 1);
                if (totalHeight < tempScrolView.LayoutParameters.Height)
                {
                    var ll = new Android.Widget.TextView(Application.Activity);
                    ll.Touch += (sender1, e1) =>
                    {
                        if (e1.Event.Action == MotionEventActions.Up)
                        {
                            ((Android.Views.ViewGroup)tempScrolView.Parent).RemoveView(tempScrolView);
                        }
                    };
                    linearLayout.AddView(ll, new Android.Views.ViewGroup.LayoutParams(tempScrolView.LayoutParameters.Width, tempScrolView.LayoutParameters.Height - totalHeight));
                }
                Android.Widget.LinearLayout l = new Android.Widget.LinearLayout(Application.Activity);
                l.Orientation = Orientation.Vertical;
                linearLayout.AddView(l, new Android.Views.ViewGroup.LayoutParams(linearLayout.LayoutParameters.Width, Android.Views.ViewGroup.LayoutParams.WrapContent));
                for (int i = 0; i < this.AdapterStr.Length; i++)
                {
                    Android.Widget.Button button = new Android.Widget.Button(Application.Activity);
                    button.Text = AdapterStr[i];
                    button.SetTextColor(new Android.Graphics.Color(0x6d, 0x6d, 0x72, 0xff));
                    button.SetBackgroundColor(Android.Graphics.Color.White);
                    button.Tag = i;
                    button.Click += (sender1, e1) =>
                    {
                        ((Android.Views.ViewGroup)tempScrolView.Parent).RemoveView(tempScrolView);
                        //tempScrolView.Animation = new TranslateAnimation(
                        //            Dimension.RelativeToSelf, 0.0f,
                        //            Dimension.RelativeToSelf, 0.0f,
                        //            Dimension.RelativeToSelf, 0.0f,
                        //            Dimension.RelativeToSelf, 1.0f);
                        //tempScrolView.Animation.Duration = 500;
                        ////view.Animation.AnimationEnd += (sender, e) =>
                        ////{
                        ////    ((Android.Views.ViewGroup)view.Parent).RemoveView(view);
                        ////};
                        //tempScrolView.Animation.StartNow();
                        if (SelectedItemChanged != null)
                        {
                            SelectedItemChanged(this, (int)button.Tag);
                            Text = AdapterStr[(int)button.Tag];
                        }
                    };
                    l.AddView(button, new Android.Views.ViewGroup.LayoutParams(l.LayoutParameters.Width, DensityUtil.Dip2Px(height)));
                    if (i == AdapterStr.Length - 1)
                    {
                        //var gradientDrawable = new Android.Graphics.Drawables.GradientDrawable();
                        //gradientDrawable.SetCornerRadius(10);
                        //button.Background = gradientDrawable;
                    }
                    else {
                        Android.Widget.TextView line = new Android.Widget.TextView(Application.Activity);
                        line.SetBackgroundColor(new Android.Graphics.Color(0xdd, 0xdd, 0xdd, 0xff));
                        l.AddView(line, new Android.Views.ViewGroup.LayoutParams(Android.Views.ViewGroup.LayoutParams.MatchParent, DensityUtil.Dip2Px(1)));
                        if (i == 0)
                        {
                            //var gradientDrawable = new Android.Graphics.Drawables.GradientDrawable();
                            //gradientDrawable.SetCornerRadius(10);
                            //button.Background = gradientDrawable;
                        }
                    }
                }
                tempScrolView.Animation = new TranslateAnimation(
                                    Dimension.RelativeToSelf, 0.0f,
                                    Dimension.RelativeToSelf, 0.0f,
                                    Dimension.RelativeToSelf, 1.0f,
                                    Dimension.RelativeToSelf, 0.0f);
                tempScrolView.Animation.Duration = 500;
                tempScrolView.Animation.StartNow();
            };
        }
        int currentRow;
        /// <summary>
        /// å½“前行
        /// </summary>
        /// <value>当前行,从0开始</value>
        public int CurrentRow
        {
            get
            {
                return currentRow;
            }
            set
            {
                if (AdapterStr == null || value < 0 || AdapterStr.Length <= value)
                {
                    return;
                }
                currentRow = value;
                Text = AdapterStr[value];
            }
        }
        /// <summary>
        /// æ·»åŠ ä¸‹æ‹‰åˆ—è¡¨çš„æ•°æ®
        /// </summary>
        /// <param name="Str">String.</param>
        public string[] AdapterStr
        {
            get;
            set;
        }
        /// <summary>
        /// é€‰æ‹©åˆ—表变化的事件
        /// </summary>
        public Action<View, int> SelectedItemChanged;
        /// <summary>
        /// åˆ·æ–°å½“前视图
        /// </summary>
        public override void Refresh()
        {
            base.Refresh();
            CurrentRow = 0;
        }
    }
}
ZigbeeApp/Shared.Droid/UI/SwipeLayout.cs
New file
@@ -0,0 +1,323 @@
using System;
using Android.Content;
using Android.Views;
using Android.Views.Animations;
namespace Shared
{
    public class SwipeLayout:ViewGroup
    {
        AndroidSwipeLayout androidSwipeLayout;
        uint lineColor = 0x62818181;
        /// <summary>
        /// èƒŒæ™¯é¢œè‰²
        /// </summary>
        /// <value>The color of the background.</value>
        public virtual uint LineColor
        {
            get
            {
                return lineColor;
            }
            set
            {
                lineColor = value;
                byte a, r, g, b;
                a = (byte)(lineColor / 256 / 256 / 256 % 256);
                r = (byte)(lineColor / 256 / 256 % 256);
                g = (byte)(lineColor / 256 % 256);
                b = (byte)(lineColor % 256);
                lineLinearLayout.SetBackgroundColor(Android.Graphics.Color.Argb(a, r, g, b));
            }
        }
        /// <summary>
        /// å®½åº¦è®¾ç½®æˆ–读取
        /// </summary>
        /// <value>The width.</value>
        public override int Width
        {
            get
            {
                return base.Width;
            }
            set
            {
                base.Width = value;
                if (!IsCanRefresh)
                {
                    return;
                }
                var layoutParameters = androidSwipeLayout.LayoutParameters;
                layoutParameters.Width = Width;
                androidSwipeLayout.LayoutParameters = layoutParameters;
            }
        }
        /// <summary>
        /// è§†å›¾é«˜åº¦
        /// </summary>
        /// <value>The height.</value>
        public override int Height
        {
            get
            {
                return base.Height;
            }
            set
            {
                base.Height = value;
                if (!IsCanRefresh)
                {
                    return;
                }
                var layoutParameters = androidSwipeLayout.LayoutParameters;
                layoutParameters.Height = Height;
                androidSwipeLayout.LayoutParameters = layoutParameters;
            }
        }
        Android.Widget.LinearLayout leftLinarLayout;
        Android.Widget.LinearLayout rightLinarLayout;
        Android.Widget.LinearLayout lineLinearLayout;
        /// <summary>
        /// åœ¨æ»‘动事件下,可显示隐藏些自定义视图
        /// </summary>
        public SwipeLayout()
        {
            viewGroup = new Android.Widget.FrameLayout(Application.Activity);
            androidSwipeLayout = new AndroidSwipeLayout(Application.Activity, this);
            realViewGroup = androidSwipeLayout;
            leftLinarLayout = new Android.Widget.LinearLayout(Application.Activity) { Orientation = Android.Widget.Orientation.Horizontal, Alpha = 0.0f };
            rightLinarLayout = new Android.Widget.LinearLayout(Application.Activity) { Orientation = Android.Widget.Orientation.Horizontal, Alpha = 0.0f };
            lineLinearLayout = new Android.Widget.LinearLayout(Application.Activity);
            LineColor = lineColor;
            viewGroup.AddView(leftLinarLayout, new Android.Views.ViewGroup.LayoutParams(Android.Views.ViewGroup.LayoutParams.WrapContent, Android.Views.ViewGroup.LayoutParams.MatchParent));
            viewGroup.AddView(rightLinarLayout, new Android.Views.ViewGroup.LayoutParams(Android.Views.ViewGroup.LayoutParams.WrapContent, Android.Views.ViewGroup.LayoutParams.MatchParent));
            viewGroup.AddView(androidSwipeLayout, new Android.Views.ViewGroup.LayoutParams(Android.Views.ViewGroup.LayoutParams.MatchParent, Android.Views.ViewGroup.LayoutParams.MatchParent));
            viewGroup.AddView(lineLinearLayout, new Android.Widget.FrameLayout.LayoutParams(Android.Views.ViewGroup.LayoutParams.MatchParent, DensityUtil.Dip2Px(1), Android.Views.GravityFlags.Bottom));
        }
        void openLeftMenu()
        {
            hideRightMenu();
            if (leftLinarLayout.ChildCount == 0)
                return;
            Android.Widget.FrameLayout.LayoutParams lp = (Android.Widget.FrameLayout.LayoutParams)androidSwipeLayout.LayoutParameters;
            lp.LeftMargin = leftLinarLayout.LayoutParameters.Width;
            androidSwipeLayout.LayoutParameters = lp;
            leftLinarLayout.Alpha = 1.0f;
            leftLinarLayout.ClearAnimation();
            leftLinarLayout.Animation = new TranslateAnimation(
                Dimension.RelativeToSelf, 0.1f,
                Dimension.RelativeToSelf, 0,
                Dimension.RelativeToSelf, 0,
                Dimension.RelativeToSelf, 0);
            leftLinarLayout.Animation.Duration = 200;
            leftLinarLayout.Animation.StartNow();
        }
        void hideLeftMenu()
        {
            Android.Widget.FrameLayout.LayoutParams lp = (Android.Widget.FrameLayout.LayoutParams)androidSwipeLayout.LayoutParameters;
            lp.LeftMargin = 0;
            androidSwipeLayout.LayoutParameters = lp;
            leftLinarLayout.Alpha = 0.0f;
        }
        void openRightMenu()
        {
            hideLeftMenu();
            if (rightLinarLayout.ChildCount == 0)
                return;
            Android.Widget.FrameLayout.LayoutParams lp = (Android.Widget.FrameLayout.LayoutParams)androidSwipeLayout.LayoutParameters;
            lp.LeftMargin = -rightLinarLayout.LayoutParameters.Width;
            androidSwipeLayout.LayoutParameters = lp;
            rightLinarLayout.Alpha = 1.0f;
            if (rightLinarLayout.Animation == null)
            {
                rightLinarLayout.Animation = new TranslateAnimation(
                        Dimension.RelativeToSelf, -0.1f,
                        Dimension.RelativeToSelf, 0.0f,
                        Dimension.RelativeToSelf, 0,
                        Dimension.RelativeToSelf, 0);
                rightLinarLayout.Animation.Duration = 200;
            }
            rightLinarLayout.Animation.Reset();
            rightLinarLayout.Animation.StartNow();
        }
        void hideRightMenu()
        {
            Android.Widget.FrameLayout.LayoutParams lp = (Android.Widget.FrameLayout.LayoutParams)androidSwipeLayout.LayoutParameters;
            lp.LeftMargin = 0;
            androidSwipeLayout.LayoutParameters = lp;
            rightLinarLayout.Alpha = 0.0f;
        }
        /// <summary>
        /// å­è§†å›¾çš„宽度
        /// </summary>
        int subViewWidth = 100;
        /// <summary>
        /// å¢žåŠ å·¦è¾¹è§†å›¾
        /// </summary>
        /// <param name="view">View.</param>
        public void AddLeftView(View view)
        {
            leftLinarLayout.AddView(view.AndroidView, new Android.Views.ViewGroup.LayoutParams(DensityUtil.Dip2Px(subViewWidth), androidSwipeLayout.LayoutParameters.Height));
            leftLinarLayout.LayoutParameters.Width = leftLinarLayout.ChildCount * DensityUtil.Dip2Px(subViewWidth);
            view.Parent = this;
            view.Width = DensityUtil.Dip2Px(subViewWidth);
            view.Height = androidSwipeLayout.LayoutParameters.Height;
        }
        /// <summary>
        /// å¢žåŠ å³è¾¹è§†å›¾
        /// </summary>
        /// <param name="view">View.</param>
        public void AddRightView(View view)
        {
            rightLinarLayout.AddView(view.AndroidView, new Android.Views.ViewGroup.LayoutParams(DensityUtil.Dip2Px(subViewWidth), androidSwipeLayout.LayoutParameters.Height));
            rightLinarLayout.LayoutParameters.Width = rightLinarLayout.ChildCount * DensityUtil.Dip2Px(subViewWidth);
            ((Android.Widget.FrameLayout.LayoutParams)rightLinarLayout.LayoutParameters).LeftMargin = androidSwipeLayout.LayoutParameters.Width - rightLinarLayout.LayoutParameters.Width;
            view.Parent = this;
            view.Width = DensityUtil.Dip2Px(subViewWidth);
            view.Height = androidSwipeLayout.LayoutParameters.Height;
        }
        internal class AndroidSwipeLayout : Android.Widget.FrameLayout, GestureDetector.IOnGestureListener
        {
            /// <summary>
            /// å·¦å³æ»‘动的最短距离
            /// </summary>
            int distance = 100;
            /// <summary>
            /// å·¦å³æ»‘动的最小速度
            /// </summary>
            int velocity = 200;
            bool isFling;
            /// <summary>
            /// æ‰‹åŠ¿å¯¹è±¡
            /// </summary>
            GestureDetector mGesture;
            SwipeLayout swipeLayout;
            public AndroidSwipeLayout(Context context, SwipeLayout swipeLayout)
                : base(context)
            {
                this.swipeLayout = swipeLayout;
                mGesture = new GestureDetector(context, this);
            }
            public override bool OnTouchEvent(MotionEvent e)
            {
                if (Shared.AndroidView.IsLive(this) && !isFling)
                    swipeLayout.TouchEvent(e);
                return true;
            }
            public override bool OnInterceptTouchEvent(MotionEvent ev)
            {
                if (!Shared.AndroidView.IsLive(this))
                {
                    return false;
                }
                mGesture.OnTouchEvent(ev);
                //如果是滑动,就拦截事件,后面的事件是由自己的TouchEvent处理,子控件会收到取消事件,如果是快速滑动,事件也是自己处理
                if (isFling)
                {
                    return true;
                }
                //如果是滑动这里也会返回True
                return base.OnInterceptTouchEvent(ev);
            }
            /// <summary>
            /// è®¾ç½®æ‰€æœ‰çˆ¶è§†å›¾ç¦æ­¢æ‹¦æˆªäº‹ä»¶
            /// </summary>
            /// <param name="b">如果设置True表示不要拦截,如果设置为False表示可以拦截</param>
            void requestParentDisallowInterceptTouchEvent(bool b)
            {
                var tempParent = Parent;
                while (tempParent != null)
                {   //告诉父类不要拦截这个视图的事件
                    tempParent.RequestDisallowInterceptTouchEvent(b);
                    tempParent = tempParent.Parent;
                }
            }
            public bool OnDown(MotionEvent e)
            {
                isFling = false;
                return false;
            }
            public bool OnFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY)
            {
                // e1:第1个ACTION_DOWN MotionEvent
                // e2:最后一个ACTION_MOVE MotionEvent
                // velocityX:X轴上的移动速度(像素/秒)
                // velocityY:Y轴上的移动速度(像素/秒)
                // å‘左滑
                if (e1.GetX() - e2.GetX() > distance
                    && Math.Abs(velocityX) > velocity)
                {
                    isFling = true;
                    swipeLayout.openRightMenu();
                }
                // å‘右滑
                if (e2.GetX() - e1.GetX() > distance
                    && Math.Abs(velocityX) > velocity)
                {
                    isFling = true;
                    swipeLayout.openLeftMenu();
                }
                //迅速滑动,并松开
                return false;
            }
            public void OnLongPress(MotionEvent e)
            {
                Console.WriteLine("OnLongPress:长按不放");
            }
            public bool OnScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY)
            {
                Console.WriteLine("OnScroll:在屏幕上滑动");
                return false;
            }
            public void OnShowPress(MotionEvent e)
            {
                Console.WriteLine("OnShowPress:手指按下一段时间,还没到长按");
            }
            public bool OnSingleTapUp(MotionEvent e)
            {
                if(!isFling){
                    swipeLayout.hideLeftMenu();
                    swipeLayout.hideRightMenu();
                }
                Console.WriteLine("OnSingleTapUp:手指弹起");
                return false;
            }
        }
    }
}
ZigbeeApp/Shared.Droid/UI/TextView.cs
New file
@@ -0,0 +1,242 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Android.App;
using Android.Content;
using Android.OS;
using Android.Runtime;
using Android.Views;
using Android.Widget;
using Android.Util;
using Android.Views.InputMethods;
using Android.Text;
namespace Shared
{
    /// <summary>
    /// TextView
    /// </summary>
    public class TextView : View
    {
        /// <summary>
        /// å½“前视图
        /// </summary>
        /// <value>The android text.</value>
        AndroidTextView currentAndroidTextView
        {
            get
            {
                return AndroidView as AndroidTextView;
            }
            set
            {
                AndroidView = value;
            }
        }
        public TextView()
        {
            currentAndroidTextView = new AndroidTextView(Application.Activity,this);
        }
        /// <summary>
        /// æ–‡å­—大小
        /// </summary>
        /// <value>The size of the text.</value>
        public float TextSize
        {
            get
            {
                return currentAndroidTextView.TextSize;
            }
            set
            {
                currentAndroidTextView.SetTextSize(ComplexUnitType.Sp, value);
            }
        }
        /// <summary>
        /// æ–‡æœ¬
        /// </summary>
        /// <value>The text.</value>
        public string Text
        {
            get
            {
                return currentAndroidTextView.Text;
            }
            set
            {
                if (currentAndroidTextView.Text == value)
                {
                    return;
                }
                currentAndroidTextView.Text = value;
            }
        }
        int textID;
        /// <summary>
        /// æ ¹æ®ID获取对应的备注
        /// </summary>
        /// <value>The text I.</value>
        public int TextID
        {
            get
            {
                return textID;
            }
            set
            {
                textID = value;
                Text = Language.StringByID(TextID);
            }
        }
        bool isSelected;
        /// <summary>
        /// Gets or sets a value indicating whether this instance is selected.
        /// </summary>
        /// <value><c>true</c> if this instance is selected; otherwise, <c>false</c>.</value>
        public bool IsSelected
        {
            get
            {
                return isSelected;
            }
            set
            {
                isSelected = value;
                if (!IsCanRefresh)
                {
                    return;
                }
                if (isSelected)
                {
                    if (!Background(SelectedImagePath))
                    {
                        BackgroundColor = BackgroundColor;
                    }
                }
                else
                {
                    if (!Background(UnSelectedImagePath))
                    {
                        BackgroundColor = BackgroundColor;
                    }
                }
            }
        }
        /// <summary>
        /// åˆ·æ–°å¤§å°
        /// </summary>
        public override void Refresh()
        {
            base.Refresh();
            IsSelected = isSelected;
            currentAndroidTextView.Gravity =   GravityFlags.Center;
        }
        uint textColor;
        /// <summary>
        /// æ–‡å­—颜色
        /// </summary>
        /// <value>The color of the text.</value>
        public uint TextColor
        {
            get
            {
                return textColor;
            }
            set
            {
                textColor = value;
                byte r, g, b, a;
                r = (byte)(textColor / 256 / 256 % 256);
                g = (byte)(textColor / 256 % 256);
                b = (byte)(textColor % 256);
                a = (byte)(textColor / 256 / 256 / 256 % 256);
                currentAndroidTextView.SetTextColor(Android.Graphics.Color.Argb(a, r, g, b));
            }
        }
        bool isMoreLines;
        public bool IsMoreLines
        {
            get
            {
                return isMoreLines;
            }
            set
            {
                isMoreLines = value;
                currentAndroidTextView.SetSingleLine(!value);
            }
        }
        /// <summary>
        /// é€‰æ‹©æ—¶èƒŒæ™¯å›¾è·¯å¾„
        /// </summary>
        /// <value>The selected image path.</value>
        public string SelectedImagePath { get; set; }
        /// <summary>
        /// éžé€‰ä¸­çŠ¶æ€çš„èƒŒæ™¯å›¾è·¯å¾„
        /// </summary>
        /// <value>The un selected image path.</value>
        public string UnSelectedImagePath { get; set; }
        class AndroidTextView : Android.Widget.TextView
        {
            View _view;
            public AndroidTextView(Context context, View view)
                            : base(context)
            {
                _view = view;
                SetTextColor(Android.Graphics.Color.White);
                SetPadding(0, 0, 0, 0);
                TextAlignment = Android.Views.TextAlignment.Center;
                SetSingleLine(true);
                SetTextSize(ComplexUnitType.Sp, 10);
                Ellipsize = TextUtils.TruncateAt.Marquee;
                SetMarqueeRepeatLimit(int.MaxValue);
                System.Threading.Tasks.Task.Run(() =>
                {
                    System.Threading.Thread.Sleep(1000);
                    Application.RunOnMainThread(() =>
                    {
                        Selected = true;
                    });
                });
            }
            public override bool IsFocused
            {
                get
                {
                    return true;
                }
            }
            /// <summary>
            /// é‡å†™ç‚¹å‡»äº‹ä»¶
            /// </summary>
            /// <returns><c>true</c>, if touch event was oned, <c>false</c> otherwise.</returns>
            /// <param name="e">E.</param>
            public override bool OnTouchEvent(MotionEvent e)
            {
                if (_view != null)
                {
                    _view.TouchEvent(e);
                }
                return base.OnTouchEvent(e);
            }
        }
    }
}
ZigbeeApp/Shared.Droid/UI/TimeView.cs
New file
@@ -0,0 +1,140 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Android.App;
using Android.Content;
using Android.OS;
using Android.Runtime;
using Android.Views;
using Android.Widget;
using Android.Util;
namespace Shared
{
    /// <summary>
    /// æ—¶é—´è§†å›¾
    /// </summary>
    public class TimeView : View
    {
        /// <summary>
        /// å½“前视图
        /// </summary>
        /// <value>The android text.</value>
        internal AndroidTimePicker currentAndroidTimePicker
        {
            get
            {
                return this.AndroidView as AndroidTimePicker;
            }
            set
            {
                this.AndroidView = value;
            }
        }
        /// <summary>
        /// Ê±
        /// </summary>
        public int Hour {
            get { return currentAndroidTimePicker.CurrentHour.IntValue(); }
            set { currentAndroidTimePicker.CurrentHour = new Java.Lang.Integer(value); }
        }
        /// <summary>
        /// åˆ†
        /// </summary>
        public int Minute {
            get { return currentAndroidTimePicker.CurrentMinute.IntValue(); }
            set { currentAndroidTimePicker.CurrentMinute =new Java.Lang.Integer(value); }
        }
        /// <summary>
        /// è§†å›¾
        /// </summary>
        public TimeView()
        {
            currentAndroidTimePicker = new AndroidTimePicker(Application.Activity);
        }
        internal class AndroidTimePicker : Android.Widget.TimePicker
        {
            #region
            public AndroidTimePicker(Context context)
                : base(context)
            {
                //SetTextColor(Android.Graphics.Color.White);
                //SetPadding(0, 0, 0, 0);
                //TextAlignment = Android.Views.TextAlignment.Center;
            }
            public AndroidTimePicker(Context context, IAttributeSet attrs)
                : base(context, attrs)
            { }
            protected AndroidTimePicker(IntPtr javaReference, JniHandleOwnership transfer)
                : base(javaReference, transfer)
            { }
            public AndroidTimePicker(Context context, IAttributeSet attrs, int defStyle)
                : base(context, attrs, defStyle)
            { }
            #endregion
            /// <summary>
            /// ç‚¹å‡»å¼¹èµ·äº‹ä»¶
            /// </summary>
            public  Action<AndroidTimePicker, MouseEventArgs> MouseUPEventHandler;
            /// <summary>
            /// ç‚¹å‡»æŒ‰ä¸‹äº‹ä»¶
            /// </summary>
            public  Action<AndroidTimePicker, MouseEventArgs> MouseDownEventHandler;
            /// <summary>
            /// ç‚¹å‡»äº‹ä»¶
            /// </summary>
            /// <returns>The touch event.</returns>
            /// <param name="e">E.</param>
            public override bool OnTouchEvent(Android.Views.MotionEvent e)
            {
                if (e.Action == Android.Views.MotionEventActions.Down && MouseDownEventHandler != null)
                {
                    MouseDownEventHandler(this, new MouseEventArgs { X = e.GetX(), Y = e.GetY() });
                }
                else if (e.Action == Android.Views.MotionEventActions.Up && MouseUPEventHandler != null)
                {
                    MouseUPEventHandler(this, new MouseEventArgs { X = e.GetX(), Y = e.GetY() });
                }
                return base.OnTouchEvent(e);
            }
            /// <summary>
            /// å¤§å°å˜åŒ–事件
            /// </summary>
            public Action<AndroidTimePicker, Size> SizeChangeEventHandler;
            /// <summary>
            /// ä½ç½®å¸ƒå±€
            /// </summary>
            public override Android.Views.ViewGroup.LayoutParams LayoutParameters
            {
                get
                {
                    return base.LayoutParameters;
                }
                set
                {
                    var layoutParams = base.LayoutParameters;
                    base.LayoutParameters = value;
                    if (layoutParams == null || layoutParams.Width != value.Width || layoutParams.Height != value.Height)
                    {
                        SizeChangeEventHandler?.Invoke(this, new Size(LayoutParameters.Width, LayoutParameters.Height));
                    }
                }
            }
        }
    }
}
ZigbeeApp/Shared.Droid/UI/Tip.cs
New file
@@ -0,0 +1,61 @@
using System;
using Android.Views;
using Android.Widget;
namespace Shared
{
    public  class Tip
    {
        public Tip()
        {
            this.BackgroundColor = 0xff323232;
            this.CloseTime = 2;
            this.MaxWidth = 100;
        }
        public int CloseTime {
            get;
            set;
        }
        public string Text {
            get;
            set;
        }
        public AMPopTipDirection Direction {
            get;
            set;
        }
        public int MaxWidth {
            get;
            set;
        }
        public uint BackgroundColor {
            get;
            set;
        }
        /// <summary>
        /// ç‚¹å‡»å“ªä¸ªView时显赫提示
        /// </summary>
        public void Show(View view)
        {
            Display display = Application.Activity.WindowManager.DefaultDisplay;
            // èŽ·å–å±å¹•é«˜åº¦
            Toast toast = Toast.MakeText (Application.Activity, Text, ToastLength.Long);
            // è¿™é‡Œç»™äº†ä¸€ä¸ª1/4屏幕高度的y轴偏移量
            toast.SetGravity (GravityFlags.Center, 0, 0);
            toast.Show ();
            //popTip.ShowText (this.Text,Direction,MaxWidth, Application.MainUIViewController.View, view.RealView.ConvertRectToView(view.RealView.Bounds,Application.MainUIViewController.View),CloseTime);
        }
    }
}
ZigbeeApp/Shared.Droid/UI/UICoverFlowView.cs
New file
@@ -0,0 +1,326 @@
using System;
using System.Collections.Generic;
using Com.Hdl.Widget.CoverFlowViewPager;
namespace Shared
{
    /// <summary>
    /// UICoverFlowView
    /// </summary>
    public class UICoverFlowView : View
    {
        /// <summary>
        ///  å½“前视图
        /// </summary>
        /// <value>The UICoverFlowView.</value>
        HDLCoverFlowViewPager mHDLCoverFlowViewPager
        {
            get
            {
                return AndroidView as HDLCoverFlowViewPager;
            }
            set
            {
                AndroidView = value;
            }
        }
        /// <summary>
        /// çˆ¶å®¹å™¨
        /// </summary>
        /// <value>The parent.</value>
        ViewGroup Parents { get;  set; }
        ///// <summary>
        ///// è§†å›¾é«˜åº¦
        ///// </summary>
        ///// <value>The height.</value>
        //public override int Height
        //{
        //    get
        //    {
        //        return base.Height;
        //    }
        //    set
        //    {
        //        base.Height = value;
        //        if (!IsCanRefresh)
        //        {
        //            return;
        //        }
        //        var layoutParameters = realViewGroup.LayoutParameters;
        //        layoutParameters.Height = Height;
        //        realViewGroup.LayoutParameters = layoutParameters;
        //    }
        //}
        ///// <summary>
        ///// è§†å›¾å®½åº¦
        ///// </summary>
        ///// <value>The width.</value>
        //public override int Width
        //{
        //    get
        //    {
        //        return base.Width;
        //    }
        //    set
        //    {
        //        base.Width = value;
        //        if (!IsCanRefresh)
        //        {
        //            return;
        //        }
        //        var layoutParameters = realViewGroup.LayoutParameters;
        //        layoutParameters.Width = Width;
        //        realViewGroup.LayoutParameters = layoutParameters;
        //    }
        //}
        /// <summary>
        /// æž„造函数
        /// </summary>
        public UICoverFlowView()
        {
            mHDLCoverFlowViewPager = new HDLCoverFlowViewPager(Application.Activity);
            //viewList.Add(new Button { });
            //UpdateViewsList();
            mHDLCoverFlowViewPager.InitBanner(mAndroidViewsList, true, 15f)//开启3D画廊效果
                .AddPageMargin(0, 100)//参数1page之间的间距,参数2中间item距离边界的间距
                .FinishConfig()//这句必须加
                .AddGalleryListener(new OnSelectChangeListener(this));
            Parents = new ViewGroup();
            //Parents.AddChidren(this);
            //mOnSelectChangeListener = new OnSelectChangeListener(this);
            //mHDLCoverFlowViewPager.SetOptionsSelectChangeListener(mOnSelectChangeListener);
        }
        List<Android.Views.View> mAndroidViewsList = new List<Android.Views.View>();
        List<View> viewList = new List<View>();
        private void UpdateViewsList()
        {
            mAndroidViewsList.Clear();
            foreach (View MView in viewList)
            {
                mAndroidViewsList.Add(MView.AndroidView);
            }
            mHDLCoverFlowViewPager.UpdateViewsList(mAndroidViewsList);
        }
        int pageIndex;
        /// <summary>
        /// è®¾ç½®æˆ–者获取当前的界面索引
        /// </summary>
        /// <value>The index of the page.</value>
        public int PageIndex
        {
            get
            {
                return pageIndex;
            }
            set
            {
                if (value < 0 || viewList.Count < value)
                {
                    return;
                }
                pageIndex = value;
                mHDLCoverFlowViewPager.SetCurrentItem(pageIndex);
            }
        }
        public void Remove(View view)
        {
            if (view == null)
            {
                return;
            }
            viewList.Remove(view);
            //realViewGroup.RemoveView(view.AndroidView);
            //view.Parent = null;
            //base.Remove(view);
            //UpdateViewsList();
        }
        /// <summary>
        /// å¢žåŠ å­æŽ§ä»¶
        /// </summary>
        /// <param name="view">View.</param>
        public void AddChidren(View view)
        {
            view.Parent = Parents;
            viewList.Add(view);
            UpdateViewsList();
            view.Refresh();
            if (view is ViewGroup)
            {
                var tempViewGroup = (ViewGroup)view;
                for (int i = 0; i < tempViewGroup.ChildrenCount; i++)
                {
                    tempViewGroup.GetChildren(i).Refresh();
                }
            }
            //base.AddChidren(view);
        }
        /// <summary>
        /// æ¸…空所有的控件
        /// </summary>
        public void RemoveAll()
        {
            viewList.Clear();
            //base.RemoveAll();
            UpdateViewsList();
        }
        /// <summary>
        /// ç§»é™¤æŒ‡å®šç´¢å¼•对象
        /// </summary>
        /// <param name="index">Index.</param>
        public void RemoveAt(int index)
        {
            if (GetChildren(index) != null)
            {
                viewList.Remove(GetChildren(index));
                UpdateViewsList();
            }
            //base.RemoveAt(index);
            //UpdateViewsList();
        }
        /// <summary>
        /// èŽ·å–æŒ‡å®šç´¢å¼•å¯¹è±¡
        /// </summary>
        /// <returns>The children.</returns>
        /// <param name="index">Index.</param>
        public View GetChildren(int index)
        {
            if (viewList.Count - 1 < index || index < 0)
            {
                return null;
            }
            return viewList[index];
        }
        ///// <summary>
        ///// ç§»é™¤æŽ§ä»¶
        ///// </summary>
        ///// <param name="view">View.</param>
        //internal virtual void Remove(View view)
        //{
        //    if (view == null)
        //    {
        //        return;
        //    }
        //    mViewsList.Remove(view);
        //    UpdateViewsList(mViewsList);
        //    view.Parent = null;
        //}
        ///// <summary>
        ///// è®¾ç½®PickerView é»˜è®¤é€‰ä¸­é¡¹
        ///// </summary>
        //public void setCurrentItems(int option1, int option2, int option3)
        //{
        //    mHDLCoverFlowViewPager.SetCurrentItems(option1, option2, option3);
        //}
        ///// <summary>
        ///// è®¾ç½®PickerView数据
        ///// </summary>
        //public void setNPicker(List<string> mFirstList, List<string> mSecondList, List<string> mThirdList)
        //{
        //    mHDLCoverFlowViewPager.SetNPicker(mFirstList, mSecondList, mThirdList);
        //}
        ///// <summary>
        ///// è®¾ç½®PickerView é€‰ä¸­æ–‡å­—的颜色
        ///// </summary>
        //public void setTextColorCenter(uint mColor , int indexID) {
        //    byte r, g, b, a;
        //    r = (byte)(mColor / 256 / 256 % 256);
        //    g = (byte)(mColor / 256 % 256);
        //    b = (byte)(mColor % 256);
        //    a = (byte)(mColor / 256 / 256 / 256 % 256);
        //    mHDLCoverFlowViewPager.SetTextColorCenter(Android.Graphics.Color.Argb(a, r, g, b), indexID);
        //}
        public Action<int> OnSelectChangeEvent;
        public Action<int> OnCoverFlowViewClickEvent;
        /// <summary>
        /// OnProgressChangeListener ç»§æ‰¿å“åº”事件
        /// </summary>
        OnSelectChangeListener mOnSelectChangeListener;
        public class OnSelectChangeListener : Java.Lang.Object, HDLCoverFlowViewPager.IOnClickGalleryListener
        {
            UICoverFlowView _UICoverFlowView;
            public OnSelectChangeListener(UICoverFlowView view)
            {
                _UICoverFlowView = view;
            }
            public void OnGalleryClick(int p0)
            {
                _UICoverFlowView.OnCoverFlowViewClickEvent?.Invoke(p0);
                _UICoverFlowView.pageIndex = p0;
            }
            public void OnGalleryPositionChange(int p0)
            {
                _UICoverFlowView.OnSelectChangeEvent?.Invoke(p0);
                _UICoverFlowView.pageIndex = p0;
            }
        }
    }
}
ZigbeeApp/Shared.Droid/UI/UIDrawerLayout.cs
New file
@@ -0,0 +1,328 @@
using System;
using Android.Content;
using Android.Views;
using Android.Support.V4.View;
using Android.Widget;
using Android.Support.V4.Widget;
namespace Shared
{
    /// <summary>
    /// å³æ»‘抽屉View
    /// </summary>
    public class UIDrawerLayout : ViewGroup
    {
        AndroidDrawerLayout androidDrawerLayout;
        /// <summary>
        /// å®½åº¦è®¾ç½®æˆ–读取
        /// </summary>
        /// <value>The width.</value>
        public override int Width
        {
            get
            {
                return base.Width;
            }
            set
            {
                base.Width = value;
                if (!IsCanRefresh)
                {
                    return;
                }
                var layoutParameters = androidDrawerLayout.LayoutParameters;
                layoutParameters.Width = Width;
                androidDrawerLayout.LayoutParameters = layoutParameters;
            }
        }
        /// <summary>
        /// è§†å›¾é«˜åº¦
        /// </summary>
        /// <value>The height.</value>
        public override int Height
        {
            get
            {
                return base.Height;
            }
            set
            {
                base.Height = value;
                if (!IsCanRefresh)
                {
                    return;
                }
                var layoutParameters = androidDrawerLayout.LayoutParameters;
                layoutParameters.Height = Height;
                androidDrawerLayout.LayoutParameters = layoutParameters;
            }
        }
        LinearLayout leftLinarLayout;
        Android.Widget.FrameLayout mainLinarLayout;
        /// <summary>
        /// åœ¨æ»‘动事件下,可显示隐藏些自定义视图
        /// </summary>
        public UIDrawerLayout()
        {
            //viewGroup = new Android.Widget.FrameLayout(Application.Activity);
            androidDrawerLayout = new AndroidDrawerLayout(Application.Activity, this) { };
            viewGroup = androidDrawerLayout;
            leftLinarLayout = new LinearLayout(Application.Activity) {  Alpha = 1.0f };
            mainLinarLayout = new Android.Widget.FrameLayout(Application.Activity) { Alpha = 1.0f };
            //viewGroup.AddView(androidDrawerLayout, new DrawerLayout.LayoutParams(DrawerLayout.LayoutParams.MatchParent, DrawerLayout.LayoutParams.MatchParent));
            realViewGroup = mainLinarLayout;
            DrawerLayout.LayoutParams lp = new DrawerLayout.LayoutParams(DrawerLayout.LayoutParams.MatchParent, DrawerLayout.LayoutParams.MatchParent);
            androidDrawerLayout.AddView(mainLinarLayout, lp);
            DrawerLayout.LayoutParams lp2 = new DrawerLayout.LayoutParams(Application.CurrentWidth, DrawerLayout.LayoutParams.MatchParent);
            lp2.Gravity = GravityCompat.Start;
            androidDrawerLayout.AddView(leftLinarLayout, lp2);
        }
        /// <summary>
        /// æ˜¯å¦é”å®šå³æ»‘功能, é”å®šåŽå³æ»‘弹出菜单失效
        /// </summary>
        bool _IsDrawerLockMode;
        public bool IsDrawerLockMode
        {
            get
            {
                return _IsDrawerLockMode;
            }
            set
            {
                _IsDrawerLockMode = value;
                if (_IsDrawerLockMode)
                {
                    androidDrawerLayout.SetDrawerLockMode(DrawerLayout.LockModeLockedClosed);
                }
                else
                {
                    androidDrawerLayout.SetDrawerLockMode(DrawerLayout.LockModeUnlocked);
                }
            }
        }
        /// <summary>
        /// æ‰“开抽屉view
        /// </summary>
        public void OpenLeftMenu()
        {
            if (!androidDrawerLayout.IsDrawerOpen(GravityCompat.Start))
            {
                androidDrawerLayout.OpenDrawer(GravityCompat.Start);
            }
            //System.Console.WriteLine("DrawerLayout:OpenLeftMenu");
        }
        /// <summary>
        /// å…³é—­æŠ½å±‰view
        /// </summary>
        public void CloseLeftMenu()
        {
            if (androidDrawerLayout.IsDrawerOpen(GravityCompat.Start))
            {
                androidDrawerLayout.CloseDrawer(GravityCompat.Start);
            }
            //System.Console.WriteLine("DrawerLayout:CloseLeftMenu");
        }
        /// <summary>
        /// å¢žåŠ å·¦è¾¹è§†å›¾
        /// </summary>
        /// <param name="view">View.</param>
        public void AddLeftView(View view)
        {
            view.Parent = this;
            if (view.AndroidView.Parent != null)
            {
                (view.AndroidView.Parent as Android.Views.ViewGroup)?.RemoveView(view.AndroidView);
            }
            leftLinarLayout.AddView(view.AndroidView, new Android.Views.ViewGroup.LayoutParams(leftLinarLayout.LayoutParameters.Width, leftLinarLayout.LayoutParameters.Height));
            //view.Width = leftLinarLayout.LayoutParameters.Width;
            //view.Height = leftLinarLayout.LayoutParameters.Height;
            //view.Refresh();
        }
        /// <summary>
        /// RemoveLeftView
        /// </summary>
        public void LeftViewRemoveAllViews()
        {
            if (leftLinarLayout == null) return;
            leftLinarLayout.RemoveAllViews();
        }
        class AndroidDrawerLayout : DrawerLayout
        {
            View _view;
            int mTouchSlop
            {
                get
                {
                    var configuration = ViewConfiguration.Get(Context);
                    //最小的滑动距离
                    return configuration.ScaledTouchSlop;
                }
            }
            public AndroidDrawerLayout(Context context, View view)
                : base(context)
            {
                _view = view;
            }
            //float mLastX, mLastY;
            ////internal bool isShowLeft;
            ////internal bool isShowRight;
            //public Action RightToLeftAction;
            //public Action LeftToRightAction;
            //bool isActioned;
            //bool action(MotionEvent e)
            //{
            //    switch (e.Action)
            //    {
            //        case MotionEventActions.Down:
            //            //记录点击的最新X坐标
            //            mLastX = e.RawX;
            //            mLastY = e.RawY;
            //            Parent?.RequestDisallowInterceptTouchEvent(true);
            //            break;
            //        case MotionEventActions.Move:
            //            var x = e.RawX;
            //            var y = e.RawY;
            //            var deltaX = x - mLastX;
            //            var deltaY = y - mLastY;
            //            if (Math.Abs(deltaY) < Math.Abs(deltaX))
            //            {
            //                if (!isActioned)
            //                {
            //                    //RightToLeftAction
            //                    if (deltaX < -mTouchSlop)
            //                    {
            //                        if (x / this.Width >= 0.5)
            //                        {
            //                            isActioned = true;
            //                            //parentDelay(true);
            //                            System.Console.WriteLine("DrawerLayout:DispatchTouchEvent:RightToLeft");
            //                            RightToLeftAction?.Invoke();
            //                        }
            //                    }
            //                    //LeftToRightAction
            //                    if (mTouchSlop < deltaX)
            //                    {
            //                        if (x / this.Width <= 0.5)
            //                        {
            //                            isActioned = true;
            //                            //parentDelay(true);
            //                            System.Console.WriteLine("DrawerLayout:DispatchTouchEvent:LeftToRight");
            //                            LeftToRightAction?.Invoke();
            //                        }
            //                    }
            //                }
            //                return true;
            //            }
            //            else
            //            {
            //                //上下滑动时,允许父控件的拦截
            //                if (4 < Math.Abs(deltaY))
            //                {
            //                    Parent?.RequestDisallowInterceptTouchEvent(false);
            //                }
            //            }
            //            break;
            //    }
            //    return false;
            //}
            ///// <summary>
            ///// æ‰§è¡ŒOnInterceptTouchEvent和OnTouchEvent
            ///// </summary>
            ///// <returns><c>true</c>事件已经处理<c>false</c>事件没有处理</returns>
            ///// <param name="e">E.</param>
            //public override bool DispatchTouchEvent(MotionEvent e)
            //{
            //    //System.Console.WriteLine($"{GetType()} Height->{Height} Width->{Width} DispatchTouchEvent->{e.Action}");
            //    if (e.Action == MotionEventActions.Down)
            //    {
            //        isActioned = false;
            //        //还原允许拦截事件
            //        RequestDisallowInterceptTouchEvent(false);
            //    }
            //    return base.DispatchTouchEvent(e);
            //}
            //public override bool OnInterceptTouchEvent(MotionEvent e)
            //{
            //    //System.Console.WriteLine($"{GetType()} Height->{Height} Width->{Width} OnInterceptTouchEvent->{e.Action}");
            //    if (disallowIntercept)
            //    {
            //        return false;
            //    }
            //    if (action(e))
            //    {
            //        return true;
            //    }
            //    return base.OnInterceptTouchEvent(e);
            //}
            ///// <summary>
            ///// é‡å†™ç‚¹å‡»äº‹ä»¶
            ///// </summary>
            ///// <returns><c>true</c>, if touch event was oned, <c>false</c> otherwise.</returns>
            ///// <param name="e">E.</param>
            //public override bool OnTouchEvent(MotionEvent e)
            //{
            //    //System.Console.WriteLine($"{GetType()} Height->{Height} Width->{Width} OnTouchEvent->{e.Action}");
            //    if (!isActioned)
            //    {
            //        _view.TouchEvent(e);
            //    }
            //    action(e);
            //    return true;
            //}
            //bool disallowIntercept;
            //public override void RequestDisallowInterceptTouchEvent(bool disallowIntercept)
            //{
            //    this.disallowIntercept = disallowIntercept;
            //    //System.Console.WriteLine($"{GetType()} Height->{Height} RequestDisallowInterceptTouchEvent->{disallowIntercept}");
            //    base.RequestDisallowInterceptTouchEvent(disallowIntercept);
            //    Parent?.RequestDisallowInterceptTouchEvent(disallowIntercept);
            //}
        }
    }
}
ZigbeeApp/Shared.Droid/UI/UIPickerView.cs
New file
@@ -0,0 +1,186 @@
using System;
using Com.Hdl.Widget.Pickerview.View;
using Com.Hdl.Widget.Pickerview.Listener;
using System.Collections.Generic;
using Java.Util;
namespace Shared
{
    /// <summary>
    /// UIPickerView
    /// </summary>
    public class UIPickerView : View
    {
        /// <summary>
        ///  å½“前视图
        /// </summary>
        /// <value>The UIPickerView.</value>
        HDLPickerViewNT mPickerViewNT
        {
            get
            {
                return AndroidView as HDLPickerViewNT;
            }
            set
            {
                AndroidView = value;
            }
        }
        /// <summary>
        /// æž„造函数
        /// </summary>
        public UIPickerView()
        {
            mPickerViewNT = new HDLPickerViewNT(Application.Activity);
            mOnSelectChangeListener = new OnSelectChangeListener(this);
            mPickerViewNT.SetOptionsSelectChangeListener(mOnSelectChangeListener);
        }
        /// <summary>
        /// è®¾ç½®PickerView é»˜è®¤é€‰ä¸­é¡¹
        /// </summary>
        public void setCurrentItems(int option1, int option2, int option3)
        {
            mPickerViewNT.SetCurrentItems(option1, option2, option3);
        }
        /// <summary>
        /// è®¾ç½®PickerView数据
        /// </summary>
        //public void setPicker(List<string> mFirstList, List<List<string>> mSecondList, List<List<List<string>>> mThirdList)
        //{
        //    mPickerViewNT.SetPicker(mFirstList, mSecondList, mThirdList);
        private static string SPLIT_FLAG = ">-<";
        //}
        /// <summary>
        /// è®¾ç½®PickerView数据 è”动效果
        /// </summary>
        public void setPicker(List<string> mFirstList, List<List<string>> mSecondList)
        {
            if (mFirstList == null)
            {
                return;
            }
            if (mFirstList.Count != mSecondList.Count)
            {
                return;
            }
            var mSpliceList = new List<string>();//拼接后的数组
            for (int i = 0; i < mSecondList.Count; i++)
            {
                string mDataStr = "";
                for (int j = 0; j < mSecondList[i].Count; j++)
                {
                    mDataStr += mSecondList[i][j] + SPLIT_FLAG;
                }
                mSpliceList.Add(mDataStr);
            }
            mPickerViewNT.SetPickerString(mFirstList, mSpliceList);
            //IList<IList<string>> newSecondList = new List<IList<string>>();
            //foreach (List<string> mm in mSecondList)
            //{
            //    newSecondList.Add(mm);
            //}
            //mPickerViewNT.SetPicker(mFirstList, newSecondList);
            //IDictionary<string, IList<string>> newSecondListDictionary = new Dictionary<string, IList<string>>();
            ////foreach (List<string> mm in mSecondList)
            ////{
            ////    newSecondListDictionary.Add(mFirstList );
            ////}
            //for(int i=0;i< mFirstList.Count;i++)
            //{
            //    newSecondListDictionary.Add(mFirstList[i], mSecondList[i]);
            //}
            //mPickerViewNT.SetPickerHashMap(mFirstList, newSecondListDictionary);
        }
        /// <summary>
        /// è®¾ç½®PickerView数据 ä¸è”动
        /// </summary>
        public void setNPicker(List<string> mFirstList, List<string> mSecondList, List<string> mThirdList)
        {
            mPickerViewNT.SetNPicker(mFirstList, mSecondList, mThirdList);
        }
        /// <summary>
        /// è®¾ç½®PickerView é€‰ä¸­æ–‡å­—的颜色
        /// </summary>
        public void setTextColorCenter(uint mColor , int indexID) {
            byte r, g, b, a;
            r = (byte)(mColor / 256 / 256 % 256);
            g = (byte)(mColor / 256 % 256);
            b = (byte)(mColor % 256);
            a = (byte)(mColor / 256 / 256 / 256 % 256);
            mPickerViewNT.SetTextColorCenter(Android.Graphics.Color.Argb(a, r, g, b), indexID);
        }
        public Action<int, int, int> OnSelectChangeEvent;
        /// <summary>
        /// OnProgressChangeListener ç»§æ‰¿å“åº”事件
        /// </summary>
        OnSelectChangeListener mOnSelectChangeListener;
        public class OnSelectChangeListener : Java.Lang.Object, IOnOptionsSelectChangeListener
        {
            UIPickerView _UIPickerView;
            public OnSelectChangeListener(UIPickerView view)
            {
                _UIPickerView = view;
            }
            public void OnOptionsSelectChanged(int selectIndex1, int selectIndex2, int selectIndex3)
            {
                _UIPickerView.OnSelectChangeEvent?.Invoke(selectIndex1, selectIndex2, selectIndex3);
            }
        }
    }
}
ZigbeeApp/Shared.Droid/UI/UrlMonitor.cs
New file
@@ -0,0 +1,94 @@
using System;
using System.Net;
using Android.Graphics;
using Android.Graphics.Drawables;
namespace Shared
{
    public class UrlMonitor : View
    {
        public UrlMonitor()
        {
            AndroidView = new Android.Widget.TextView(Application.Activity);
        }
        //是否已经启动
        bool isStarted;
        /// <summary>
        /// ç”¨æˆ·å
        /// </summary>
        public string UserName = "";
        /// <summary>
        /// å¯†ç 
        /// </summary>
        public string Password = "";
        /// <summary>
        /// æ‘„像头的图片地址
        /// </summary>
        public string URL;
        /// <summary>
        /// å¯åЍ
        /// </summary>
        public void Start()
        {
            if (isStarted)
            {
                return;
            }
            isStarted = true;
            System.Threading.Tasks.Task.Run(() =>
                {
                    while (isStarted)
                    {
                        System.Threading.Thread.Sleep(100);
                        try
                        {
                            WebClient webClient = new WebClient();
                            webClient.Headers.Add("Accept-Encoding", "gzip, deflate");
                            webClient.Headers.Add("Authorization", "Basic " + Convert.ToBase64String(System.Text.Encoding.ASCII.GetBytes(UserName + ":" + Password)));
                            var bytes = webClient.DownloadData(URL);
                            var bitmpap = BitmapFactory.DecodeByteArray(bytes, 0, bytes.Length);
                            BitmapDrawable background = null;
                            if (Application.IsPad)
                            {
                                background = new BitmapDrawable(bitmpap);
                            }
                            else
                            {
                                var matrix = new Matrix();
                                //旋转图片 åŠ¨ä½œ
                                matrix.PostRotate(90);
                                var newBitmpap = Bitmap.CreateBitmap(bitmpap, 0, 0, bitmpap.Width, bitmpap.Height, matrix, false);
                                background = new BitmapDrawable(newBitmpap);
                                if (bitmpap != newBitmpap)
                                {
                                    bitmpap.Recycle();
                                }
                            }
                            Shared.Application.RunOnMainThread(() =>
                                    {
                                        try
                                        {
                                            AndroidView.Background = background;
                                        }
                                        catch { }
                                    });
                        }
                        catch { }
                    }
                });
        }
        /// <summary>
        /// åœæ­¢æ’­æ”¾
        /// </summary>
        public void Stop()
        {
            isStarted = false;
        }
    }
}
ZigbeeApp/Shared.Droid/UI/VerticalRefreshLayout.cs
New file
@@ -0,0 +1,360 @@
using System;
using Android.Widget;
using Com.Scwang.Smartrefresh.Layout;
using Com.Scwang.Smartrefresh.Layout.Header;
using Com.Scwang.Smartrefresh.Layout.Listener;
using Com.Scwang.Smartrefresh.Layout.Api;
using Com.Scwang.Smartrefresh.Layout.Constant;
namespace Shared
{
    //VerticalRefreshLayout å¸¦ä¸‹æ‹‰åˆ·æ–°
    /// <summary>
    /// ä½ç½®å¸ƒå±€â€¨    /// </summary>
    public class VerticalRefreshLayout : ViewGroup
    {
        public Action BeginHeaderRefreshingAction;
        private ScrollView mAndroidRefreshScrolView;
        private SmartRefreshLayout mSmartRefreshLayout;
        /// <summary>
        /// æž„造函数
        /// </summary>
        public VerticalRefreshLayout()
        {
            mSmartRefreshLayout = new SmartRefreshLayout(Application.Activity);
            ClassicsHeader mClassicsHeader = new ClassicsHeader(Application.Activity);
            //隐藏最后刷新时间文字
            //mClassicsHeader.SetEnableLastTime(false);
            mSmartRefreshLayout.SetRefreshHeader(mClassicsHeader);
            mOnRefreshListener = new OnRefreshListener(this);
            mSmartRefreshLayout.SetOnRefreshListener(mOnRefreshListener);
            viewGroup = mSmartRefreshLayout;
            mAndroidRefreshScrolView = new ScrollView(Application.Activity, null);
            viewGroup.AddView(mAndroidRefreshScrolView);
            realViewGroup = new AndroidLinearLayout(Application.Activity, this);
            (realViewGroup as AndroidLinearLayout).Orientation = Orientation.Vertical;
            mAndroidRefreshScrolView.AddView(realViewGroup);
            _isCanHeaderRefresh = true;
        }
        OnRefreshListener mOnRefreshListener;
        public class OnRefreshListener : Java.Lang.Object, IOnRefreshListener
        {
            VerticalRefreshLayout _VerticalRefreshLayout;
            public OnRefreshListener(VerticalRefreshLayout view)
            {
                _VerticalRefreshLayout = view;
            }
            public void OnRefresh(IRefreshLayout p0)
            {
                _VerticalRefreshLayout.BeginHeaderRefreshingAction?.Invoke();
            }
        }
            /// <summary>
        /// è§†å›¾å®½åº¦â€¨        /// </summary>
        /// <value>The width.</value>
        public override int Width
        {
            get
            {
                return base.Width;
            }
            set
            {
                base.Width = value;
                if (!IsCanRefresh)
                {
                    return;
                }
                var layoutParameters = realViewGroup.LayoutParameters;
                layoutParameters.Width = Width;
                realViewGroup.LayoutParameters = layoutParameters;

            }
        }

        /// <summary>
        /// è§†å›¾é«˜åº¦â€¨        /// </summary>
        /// <value>The height.</value>
        public override int Height
        {
            get
            {
                return base.Height;
            }
            set
            {
                base.Height = value;
                if (!IsCanRefresh)
                {
                    return;
                }
                var layoutParameters = realViewGroup.LayoutParameters;
                layoutParameters.Height = Height;
                realViewGroup.LayoutParameters = layoutParameters;
            }
        }
        ///// <summary>
        ///// æ˜¯å¦å…è®¸æ»‘动
        ///// </summary>
        ///// <value><c>true</c> if scroll enabled; otherwise, <c>false</c>.</value>
        //public bool ScrollEnabled
        //{
        //    get
        //    {
        //        return (mAndroidRefreshScrolView as AndroidScrolView).ScrollEnable;
        //    }
        //    set
        //    {
        //        (mAndroidRefreshScrolView as AndroidScrolView).ScrollEnable = value;
        //    }
        //}
        ///// <summary>
        ///// æ˜¯å¦æ­£åœ¨æ»‘动
        ///// </summary>
        ///// <value><c>true</c> if decelerating; otherwise, <c>false</c>.</value>
        //public bool Decelerating
        //{
        //    get
        //    {
        //        return false;
        //    }
        //}
        //***************************下拉刷新***************************
        /// <summary>
        /// æ˜¯å¦æ”¯æŒä¸‹æ‹‰åˆ·æ–°â€¨        /// </summary>
        bool _isCanHeaderRefresh;
        private bool IsCanHeaderRefresh
        {
            get
            {
                return _isCanHeaderRefresh;
            }
            set
            {
                _isCanHeaderRefresh = value;
            }
        }
        /// <summary>
        /// å¤´å¼€å§‹åˆ·æ–°â€¨        /// </summary>
        public void BeginHeaderRefreshing()
        {
            if (!IsCanHeaderRefresh) return;
            if (mSmartRefreshLayout.State != RefreshState.Refreshing)
            {
                mSmartRefreshLayout.AutoRefresh();
                //System.Console.WriteLine("AutoRefresh");
            }
        }
        /// <summary>
        /// å¤´ç»“束刷新
        /// </summary>
        public void EndHeaderRefreshing()
        {
            if (!IsCanHeaderRefresh) return;
            if (mSmartRefreshLayout.State == RefreshState.Refreshing)
            {
                mSmartRefreshLayout.FinishRefresh();
                //System.Console.WriteLine("FinishRefresh");
            }
        }
        /// <summary>
        /// æ˜¯å¦æ˜¾ç¤ºæ»šåŠ¨æ¡â€¨        /// </summary>
        //bool _IsShowScrollBar;
        public bool VerticalScrollBarEnabled
        {
            get
            {
                return mAndroidRefreshScrolView.VerticalScrollBarEnabled;
            }
            set
            {
                mAndroidRefreshScrolView.VerticalScrollBarEnabled = value;
            }
        }
        ////***************************上拉加载***************************
        ///// <summary>
        ///// æ˜¯å¦æ­£åœ¨ä¸Šæ‹‰åŠ è½½
        ///// </summary>
        //bool _isFooterRefreshing;
        //public bool IsFooterRefreshing
        //{
        //    get
        //    {
        //        return _isFooterRefreshing;
        //    }
        //    set
        //    {
        //        _isFooterRefreshing = value;
        //    }
        //}
        ///// <summary>
        ///// åº•部 å¼€å§‹ä¸Šæ‹‰åŠ è½½
        ///// </summary>
        //public void beginFooterRefreshing()
        //{
        //    if (!IsCanFooterRefresh) return;
        //    if (!IsFooterRefreshing)
        //    {
        //        mFooterLoadingView.Start(mHeaderRefreshText);
        //        IsFooterRefreshing = true;
        //        beginFooterRefreshingAction?.Invoke();
        //    }
        //}
        ///// <summary>
        ///// åº•部 ç»“束上拉加载
        ///// </summary>
        //public void endFooterRefreshing()
        //{
        //    if (!IsCanFooterRefresh) return;
        //    if (IsFooterRefreshing)
        //    {
        //        mFooterLoadingView.Hide();
        //        IsFooterRefreshing = false;
        //    }
        //}
    }
    ///// <summary>
    ///// ç«–直方向滑动控件
    ///// </summary>
    //class AndroidRefreshScrolView : Android.Widget.ScrollView
    //{
    //    /// <summary>
    //    /// æ˜¯å¦å…è®¸æ»‘动
    //    /// </summary>
    //    public bool ScrollEnable = true;
    //    public Action AlreadyToTopAction;
    //    public Action AlreadyToTopUpAction;
    //    public Action AlreadyToBottomAction;
    //    View _view;
    //    /// <summary>
    //    /// æž„造函数
    //    /// </summary>
    //    /// <param name="context">Context.</param>
    //    /// <param name="view">View.</param>
    //    public AndroidRefreshScrolView(Context context, View view)
    //        : base(context)
    //    {
    //        _view = view;
    //        VerticalScrollBarEnabled = true;
    //        //mScroller = new Scroller(context, new DecelerateInterpolator());
    //    }
    //    bool bAlreadyToTop;
    //    public override bool DispatchTouchEvent(MotionEvent e)
    //    {
    //        //System.Console.WriteLine($"{GetType()} Height->{Height} Width->{Width} DispatchTouchEvent->{e.Action}");
    //        if (e.Action == MotionEventActions.Down)
    //        {
    //            //还原允许拦截事件
    //            RequestDisallowInterceptTouchEvent(false);
    //        }
    //        return base.DispatchTouchEvent(e);
    //    }
    //    float mLastX, mLastY ;
    //    public override bool OnInterceptTouchEvent(MotionEvent ev)
    //    {
    //        //System.Console.WriteLine($"{GetType()} Height->{Height} Width->{Width} OnInterceptTouchEvent->{ev.Action}");
    //        if (!ScrollEnable || disallowIntercept)
    //        {
    //            return false;
    //        }
    //        switch (ev.Action)
    //        {
    //            case MotionEventActions.Down:
    //                mLastX = ev.RawX;
    //                mLastY = ev.RawY;
    //                bAlreadyToTop = false;
    //                System.Console.WriteLine($"MotionEventActions.Down");
    //                Parent?.RequestDisallowInterceptTouchEvent(true);
    //                break;
    //            case MotionEventActions.Up:
    //                Parent?.RequestDisallowInterceptTouchEvent(true);
    //                System.Console.WriteLine($"MotionEventActions.Up");
    //                if (bAlreadyToTop)
    //                {
    //                    AlreadyToTopUpAction?.Invoke();
    //                    System.Console.WriteLine($"AlreadyToTopUpAction");
    //                }
    //                break;
    //            case MotionEventActions.Move:
    //                var x = ev.RawX;
    //                var y = ev.RawY;
    //                var deltaX = x - mLastX;
    //                var deltaY = y - mLastY;
    //                System.Console.WriteLine($"MotionEventActions.Move");
    //                if (Math.Abs(deltaX) < Math.Abs(deltaY))
    //                {
    //                    //向下滑动,如果当前已经滑动到顶,就允许父控件的拦截事件
    //                    if (deltaY > 0 && ScrollY == 0)
    //                    {
    //                        bAlreadyToTop = true;
    //                        AlreadyToTopAction?.Invoke();
    //                        Parent?.RequestDisallowInterceptTouchEvent(false);
    //                        return false;
    //                    }
    //                    //向上滑动时,如果translateY等于高度时,即表明滑动到底部,可又顶层View控制滑动
    //                    var mChildH = 0;
    //                    if (0 < ChildCount)
    //                    {
    //                        mChildH = GetChildAt(ChildCount - 1).Bottom;
    //                    }
    //                    var translateY = mChildH - ScrollY;
    //                    if (deltaY < 0 && translateY == Height)
    //                    {
    //                        AlreadyToBottomAction?.Invoke();
    //                        Parent?.RequestDisallowInterceptTouchEvent(false);
    //                        return false;
    //                    }
    //                }
    //                else
    //                {
    //                    //左右滑动时,允许父控件的拦截
    //                    if (4 < Math.Abs(deltaX))
    //                    {
    //                        Parent?.RequestDisallowInterceptTouchEvent(false);
    //                    }
    //                }
    //                break;
    //        }
    //        return base.OnInterceptTouchEvent(ev);
    //    }
    //    /// <summary>
    //    /// é‡å†™ç‚¹å‡»äº‹ä»¶
    //    /// </summary>
    //    /// <returns><c>true</c>, if touch event was oned, <c>false</c> otherwise.</returns>
    //    /// <param name="e">E.</param>
    //    public override bool OnTouchEvent(MotionEvent e)
    //    {
    //        //System.Console.WriteLine($"{GetType()} Height->{Height} Width->{Width} OnInterceptTouchEvent->{e.Action}");
    //        _view?.TouchEvent(e);
    //        base.OnTouchEvent(e);
    //        //如果返回真父控件就不需要处理了
    //        return true;
    //    }
    //    bool disallowIntercept;
    //    public override void RequestDisallowInterceptTouchEvent(bool disallowIntercept)
    //    {
    //        this.disallowIntercept = disallowIntercept;
    //        //System.Console.WriteLine($"{GetType()} Height->{Height} RequestDisallowInterceptTouchEvent->{disallowIntercept}");
    //        base.RequestDisallowInterceptTouchEvent(disallowIntercept);
    //        Parent?.RequestDisallowInterceptTouchEvent(disallowIntercept);
    //    }
    //}
}
ZigbeeApp/Shared.Droid/UI/VerticalScrolViewLayout.cs
New file
@@ -0,0 +1,42 @@
using System;
using Android.Widget;
using Android.Content;
using Android.Views;
using Android.Util;
using Android.Runtime;

namespace Shared
{
    //滑动冲突问题后面还得完善
    /// <summary>
    /// ä½ç½®å¸ƒå±€â€¨    /// </summary>
    public class VerticalScrolViewLayout : ViewGroup
    {
        /// <summary>
        /// æž„造函数
        /// </summary>
        public VerticalScrolViewLayout()
        {
            viewGroup = new AndroidScrolView(Application.Activity, null);
            realViewGroup = new AndroidLinearLayout(Application.Activity, this);
            (realViewGroup as AndroidLinearLayout).Orientation = Orientation.Vertical;
            viewGroup.AddView(realViewGroup);
        }


        /// <summary>
        /// è§†å›¾å®½åº¦â€¨        /// </summary>
        /// <value>The width.</value>
        public override int Width
        {
            get
            {
                return base.Width;
            }
            set
            {
                base.Width = value;
                if (!IsCanRefresh)
                {
                    return;
                }
                var layoutParameters = realViewGroup.LayoutParameters;
                layoutParameters.Width = Width;
                realViewGroup.LayoutParameters = layoutParameters;

            }
        }

        /// <summary>
        /// è§†å›¾é«˜åº¦â€¨        /// </summary>
        /// <value>The height.</value>
        public override int Height
        {
            get
            {
                return base.Height;
            }
            set
            {
                base.Height = value;
                if (!IsCanRefresh)
                {
                    return;
                }
                var layoutParameters = realViewGroup.LayoutParameters;
                layoutParameters.Height = Height;
                realViewGroup.LayoutParameters = layoutParameters;
            }
        }

        /// <summary>
        /// æ˜¯å¦å…è®¸æ»‘动
        /// </summary>
        /// <value><c>true</c> if scroll enabled; otherwise, <c>false</c>.</value>
        public bool ScrollEnabled
        {
            get
            {
                return (viewGroup as AndroidScrolView).ScrollEnable;
            }
            set
            {
                (viewGroup as AndroidScrolView).ScrollEnable = value;
            }
        }

        /// <summary>
        /// æ˜¯å¦æ­£åœ¨æ»‘动
        /// </summary>
        /// <value><c>true</c> if decelerating; otherwise, <c>false</c>.</value>
        public bool Decelerating
        {
            get
            {
                return false;
            }
        }
    }

    /// <summary>
    /// ç«–直方向滑动控件
    /// </summary>
    class AndroidScrolView : Android.Widget.ScrollView
    {
        /// <summary>
        /// æ˜¯å¦å…è®¸æ»‘动
        /// </summary>
        public bool ScrollEnable = true;
        View _view;
        /// <summary>
        /// æž„造函数
        /// </summary>
        /// <param name="context">Context.</param>
        /// <param name="view">View.</param>
        public AndroidScrolView(Context context, View view)
            : base(context)
        {
            _view = view;
            VerticalScrollBarEnabled = true;
        }



        public override bool DispatchTouchEvent(MotionEvent e)
        {
            System.Console.WriteLine($"{GetType()} Height->{Height} Width->{Width} DispatchTouchEvent->{e.Action}");
            if (e.Action == MotionEventActions.Down)
            {
                //还原允许拦截事件
                RequestDisallowInterceptTouchEvent(false);
            }
            return base.DispatchTouchEvent(e);
        }
        float mLastX, mLastY ;
        public override bool OnInterceptTouchEvent(MotionEvent ev)
        {
            System.Console.WriteLine($"{GetType()} Height->{Height} Width->{Width} OnInterceptTouchEvent->{ev.Action}");
            if (!ScrollEnable || disallowIntercept)
            {
                return false;
            }
            switch (ev.Action)
            {
                case MotionEventActions.Down:
                    mLastX = ev.RawX;
                    mLastY = ev.RawY;
                    Parent?.RequestDisallowInterceptTouchEvent(true);
                    break;
                case MotionEventActions.Move:
                    var x = ev.RawX;
                    var y = ev.RawY;
                    var deltaX = x - mLastX;
                    var deltaY = y - mLastY;

                    if (Math.Abs(deltaX) < Math.Abs(deltaY))
                    {
                        //向下滑动,如果当前已经滑动到顶,就允许父控件的拦截事件
                        if (deltaY > 0 && ScrollY == 0)
                        {
                            Parent?.RequestDisallowInterceptTouchEvent(false);
                            return false;
                        }
                        //向上滑动时,如果translateY等于高度时,即表明滑动到底部,可又顶层View控制滑动
                        var mChildH = 0;
                        if (0 < ChildCount)
                        {
                            mChildH = GetChildAt(ChildCount - 1).Bottom;
                        }
                        var translateY = mChildH - ScrollY;
                        if (deltaY < 0 && translateY == Height)
                        {
                            Parent?.RequestDisallowInterceptTouchEvent(false);
                            return false;
                        }
                    }
                    else
                    {
                        //左右滑动时,允许父控件的拦截
                        if (4 < Math.Abs(deltaX))
                        {
                            Parent?.RequestDisallowInterceptTouchEvent(false);
                        }
                    }
                    break;
            }

            return base.OnInterceptTouchEvent(ev);
        }
        /// <summary>
        /// é‡å†™ç‚¹å‡»äº‹ä»¶â€¨        /// </summary>
        /// <returns><c>true</c>, if touch event was oned, <c>false</c> otherwise.</returns>
        /// <param name="e">E.</param>
        public override bool OnTouchEvent(MotionEvent e)
        {
            System.Console.WriteLine($"{GetType()} Height->{Height} Width->{Width} OnInterceptTouchEvent->{e.Action}");
            _view?.TouchEvent(e);
            base.OnTouchEvent(e);
            //如果返回真父控件就不需要处理了
            return true;
        }
        bool disallowIntercept;
        public override void RequestDisallowInterceptTouchEvent(bool disallowIntercept)
        {
            this.disallowIntercept = disallowIntercept;
            System.Console.WriteLine($"{GetType()} Height->{Height} RequestDisallowInterceptTouchEvent->{disallowIntercept}");
            base.RequestDisallowInterceptTouchEvent(disallowIntercept);
            Parent?.RequestDisallowInterceptTouchEvent(disallowIntercept);
        }
    }
}
ZigbeeApp/Shared.Droid/UI/VerticalSeekBar.cs
New file
@@ -0,0 +1,414 @@
using System;
using Android.Widget;
using Android.Content;
using Android.Graphics;
using Android.Views;
using Android.Util;
using Android.Runtime;
namespace Shared
{
    //已经全面检查了代码
    /// <summary>
    /// ä½ç½®å¸ƒå±€
    /// </summary>
    public class VerticalSeekBar : View
    {
        /// <summary>
        /// å½“前视图
        /// </summary>
        /// <value>The android horizonetal seek bar.</value>
        VerticalSeekBarAndroidFrameLayout verticalSeekBarAndroidFrameLayout
        {
            get
            {
                return AndroidView as VerticalSeekBarAndroidFrameLayout;
            }
            set
            {
                AndroidView = value;
            }
        }
        Android.Widget.ImageView btnBackgroundColor;
        /// <summary>
        /// æ˜¾ç¤ºè¿›åº¦æŽ§ä»¶
        /// </summary>
        Android.Widget.ImageView btnProgressColor;
        /// <summary>
        /// æ»‘块
        /// </summary>
        Android.Widget.ImageView btnThum;
        /// <summary>
        /// å½“前实例
        /// </summary>
        public VerticalSeekBar()
        {
            verticalSeekBarAndroidFrameLayout = new VerticalSeekBarAndroidFrameLayout(Application.Activity, this);
            btnBackgroundColor = new Android.Widget.ImageView(Application.Activity);
            verticalSeekBarAndroidFrameLayout.AddView(btnBackgroundColor, new Android.Widget.FrameLayout.LayoutParams(DensityUtil.Dip2Px(1), 0, GravityFlags.CenterHorizontal));
            btnProgressColor = new Android.Widget.ImageView(Application.Activity);
            verticalSeekBarAndroidFrameLayout.AddView(btnProgressColor, new Android.Widget.FrameLayout.LayoutParams(DensityUtil.Dip2Px(1), 0, GravityFlags.CenterHorizontal));
            btnThum = new Android.Widget.ImageView(Application.Activity);
            verticalSeekBarAndroidFrameLayout.AddView(btnThum, new Android.Widget.FrameLayout.LayoutParams(DensityUtil.Dip2Px(24), DensityUtil.Dip2Px(24), GravityFlags.CenterHorizontal));
        }
        internal override bool TouchEvent(MotionEvent e)
        {
            switch (e.Action)
            {
                case MotionEventActions.Down:
                    dateTime = DateTime.Now;
                    setButtonLoaction((int)e.GetY());
                    break;
                case MotionEventActions.Move:
                    setButtonLoaction((int)e.GetY());
                    break;
                case MotionEventActions.Cancel:
                case MotionEventActions.Up:
                    dateTime = DateTime.MinValue;
                    setButtonLoaction((int)e.GetY());
                    break;
            }
            return base.TouchEvent(e);
        }
        /// <summary>
        /// å½“前视图的高度
        /// </summary>
        /// <value>The height.</value>
        public override int Height
        {
            get
            {
                return base.Height;
            }
            set
            {
                base.Height = value;
                var frameBackgroundColor = btnBackgroundColor.LayoutParameters as Android.Widget.FrameLayout.LayoutParams;
                frameBackgroundColor.Height = base.Height;
                btnBackgroundColor.LayoutParameters = frameBackgroundColor;
            }
        }
        DateTime dateTime;
        /// <summary>
        ///  è¿›åº¦å˜åŒ–事件
        /// </summary>
        public Action<View, int> ProgressChanged;
        int max = 100;
        /// <summary>
        /// æœ€å¤§å€¼
        /// </summary>
        /// <value>The max.</value>
        public int Max
        {
            get
            {
                return max;
            }
            set
            {
                max = value;
            }
        }
        bool isCanScrolled = true;
        /// <summary>
        /// æ˜¯å¦å…è®¸æ»‘动滑块
        /// </summary>
        /// <value><c>true</c> if is can scrolled; otherwise, <c>false</c>.</value>
        public bool IsCanScrolled
        {
            get
            {
                return isCanScrolled;
            }
            set
            {
                isCanScrolled = value;
            }
        }
        int validHeight
        {
            get
            {
                return AndroidView.Height - btnThum.Height;
            }
        }
        //2019-08-29 æ”¹100毫秒
        public int DelayTime = 100;
        //防止跳动,延时显示状态
        DateTime delayDateTime = DateTime.MinValue;
        int progress;
        /// <summary>
        /// å½“前进度
        /// </summary>
        /// <value>The progress.</value>
        public int Progress
        {
            get
            {
                return (int)(Max * (validHeight - btnThum.Top) / validHeight);
            }
            set
            {
                progress = value;
                if (!IsCanRefresh)
                {
                    return;
                }
                //发送命令后3000毫秒内不更新状态,防止跳动
                if ((DateTime.Now - delayDateTime).TotalMilliseconds < DelayTime)
                {
                    return;
                }
                if (Max < progress)
                {
                    progress = Max;
                }
                var frameThum = btnThum.LayoutParameters as Android.Widget.FrameLayout.LayoutParams;
                frameThum.TopMargin = (int)(1.0f * (Max - progress) / Max * validHeight);
                btnThum.LayoutParameters = frameThum;
                var frameProgress = btnProgressColor.LayoutParameters as Android.Widget.FrameLayout.LayoutParams;
                frameProgress.TopMargin = frameThum.TopMargin + frameThum.Height / 2;
                frameProgress.Height = AndroidView.LayoutParameters.Height - frameProgress.TopMargin;
                btnProgressColor.LayoutParameters = frameProgress;
            }
        }
        /// <summary>
        /// åˆ·æ–°å½“前对象
        /// </summary>
        public override void Refresh()
        {
            base.Refresh();
            ProgressColor = progressColor;
            BackgroundColor = BackgroundColor;
            ThumbColor = thumbColor;
            Progress = progress;
        }
        /// <summary>
        /// æ»‘动休眠时间
        /// </summary>
        public int SleepTime = 0;
        uint progressColor = 0x99000099;
        /// <summary>
        /// è¿›åº¦è§†å›¾é¢œè‰²
        /// </summary>
        /// <value>The color of the progress.</value>
        public uint ProgressColor
        {
            get
            {
                return progressColor;
            }
            set
            {
                progressColor = value;
                if (!IsCanRefresh)
                {
                    return;
                }
                byte r, g, b, a;
                r = (byte)(progressColor / 256 / 256 % 256);
                g = (byte)(progressColor / 256 % 256);
                b = (byte)(progressColor % 256);
                a = (byte)(progressColor / 256 / 256 / 256 % 256);
                btnProgressColor.SetBackgroundColor(Android.Graphics.Color.Argb(a, r, g, b));
            }
        }
        uint backgroundColor=0xFFFFFFFF;
        /// <summary>
        /// è¿›åº¦è§†å›¾é¢œè‰²
        /// </summary>
        /// <value>The color of the progress.</value>
        public new uint BackgroundColor
        {
            get
            {
                return backgroundColor;
            }
            set
            {
                backgroundColor = value;
                if (!IsCanRefresh)
                {
                    return;
                }
                byte r, g, b, a;
                r = (byte)(backgroundColor / 256 / 256 % 256);
                g = (byte)(backgroundColor / 256 % 256);
                b = (byte)(backgroundColor % 256);
                a = (byte)(backgroundColor / 256 / 256 / 256 % 256);
                btnBackgroundColor.SetBackgroundColor(Android.Graphics.Color.Argb(a, r, g, b));
            }
        }
        uint thumbColor = 0xFFFFFFFF;
        /// <summary>
        /// æ»‘块颜色
        /// </summary>
        /// <value>The color of the background.</value>
        public uint ThumbColor
        {
            get
            {
                return thumbColor;
            }
            set
            {
                thumbColor = value;
                var gradientDrawable = new Android.Graphics.Drawables.GradientDrawable();
                gradientDrawable.SetCornerRadius(DensityUtil.Dip2Px(12));
                byte r, g, b, a;
                r = (byte)(thumbColor / 256 / 256 % 256);
                g = (byte)(thumbColor / 256 % 256);
                b = (byte)(thumbColor % 256);
                a = (byte)(thumbColor / 256 / 256 / 256 % 256);
                gradientDrawable.SetColor(Android.Graphics.Color.Argb(a, r, g, b).ToArgb());
                btnThum.Background = gradientDrawable;
            }
        }
        int beforValue = 0;
        //将图片移动到点击的位置
        void setButtonLoaction(int y)
        {
            if (!IsCanScrolled)
            {
                return;
            }
            delayDateTime = DateTime.Now;
            if (y < 0)
            {
                y = 0;
            }
            if (validHeight < y)
            {
                y = validHeight;
            }
            var frameThum = btnThum.LayoutParameters as Android.Widget.FrameLayout.LayoutParams;
            frameThum.TopMargin = y;
            btnThum.LayoutParameters = frameThum;
            var frameProgress = btnProgressColor.LayoutParameters as Android.Widget.FrameLayout.LayoutParams;
            frameProgress.TopMargin = frameThum.TopMargin + frameThum.Height / 2;
            frameProgress.Height = AndroidView.LayoutParameters.Height - frameProgress.TopMargin;
            btnProgressColor.LayoutParameters = frameProgress;
            if (dateTime == DateTime.MinValue)
            {
                if (ProgressChanged != null && beforValue != Progress)
                {
                    dateTime = DateTime.Now;
                    delayDateTime = DateTime.Now;
                    ProgressChanged(this, beforValue = Progress);
                }
            }
            else
            {
                //变化大于500毫秒的时候才通知
                if (SleepTime < (DateTime.Now - dateTime).TotalMilliseconds)
                {
                    dateTime = DateTime.Now;
                    delayDateTime = DateTime.Now;
                    if (ProgressChanged != null && beforValue != Progress)
                    {
                        ProgressChanged(this, beforValue = Progress);
                    }
                }
            }
        }
        /// <summary>
        /// éœ€è¦é‡å†™çš„视图
        /// </summary>
        class VerticalSeekBarAndroidFrameLayout : Android.Widget.FrameLayout
        {
            View _view;
            public VerticalSeekBarAndroidFrameLayout(Context context, View view)
                : base(context)
            {
                _view = view;
                Touch += (sender, e) =>
                {
                    if (_view != null)
                    {
                        _view.TouchEvent(e.Event);
                    }
                };
            }
            /// <summary>
            /// æ‰€æœ‰äº‹ä»¶æœ¬è§†å›¾å…¨éƒ¨æ¶ˆåŒ–,不通知给子视图
            /// </summary>
            /// <returns><c>true</c>事件已经处理<c>false</c>需要父视图处理</returns>
            /// <param name="ev">Ev.</param>
            public override bool OnInterceptTouchEvent(MotionEvent ev)
            {
                //不需要子视图处理事件,所有的事件自己处理
                return true;
            }
            float startPointX;
            /// <summary>
            /// æ‰§è¡ŒOnInterceptTouchEvent和OnTouchEvent
            /// </summary>
            /// <returns><c>true</c>事件已经处理<c>false</c>事件没有处理</returns>
            /// <param name="e">E.</param>
            public override bool DispatchTouchEvent(MotionEvent e)
            {
                switch (e.Action)
                {
                    case MotionEventActions.Down:
                        startPointX = e.RawX;
                        requestParentDisallowInterceptTouchEvent(true);
                        break;
                    case MotionEventActions.Move:
                        if (20 < Math.Abs(e.RawX - startPointX))
                        {
                            requestParentDisallowInterceptTouchEvent(false);
                        }
                        break;
                    case MotionEventActions.Up:
                    case MotionEventActions.Cancel:
                        requestParentDisallowInterceptTouchEvent(false);
                        break;
                }
                return base.DispatchTouchEvent(e);
            }
            /// <summary>
            /// è®¾ç½®æ‰€æœ‰çˆ¶è§†å›¾ç¦æ­¢æ‹¦æˆªäº‹ä»¶
            /// </summary>
            /// <param name="b">如果设置True表示不要拦截,如果设置为False表示可以拦截</param>
            void requestParentDisallowInterceptTouchEvent(bool b)
            {
                var tempParent = Parent;
                while (tempParent != null)
                {   //告诉父类不要拦截这个视图的事件
                    tempParent.RequestDisallowInterceptTouchEvent(b);
                    tempParent = tempParent.Parent;
                }
            }
        }
    }
}
ZigbeeApp/Shared.Droid/UI/Video.cs
New file
@@ -0,0 +1,217 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Android.App;
using Android.Content;
using Android.OS;
using Android.Runtime;
using Android.Views;
using Android.Widget;
using Android.Util;
using Android.Graphics;
//using IO.Vov.Vitamio;
//using OnBufferingUpdateListener = IO.Vov.Vitamio.MediaPlayer.IOnBufferingUpdateListener;
//using OnCompletionListener = IO.Vov.Vitamio.MediaPlayer.IOnCompletionListener;
//using OnPreparedListener = IO.Vov.Vitamio.MediaPlayer.IOnPreparedListener;
namespace Shared
{
    /// <summary>
    /// Button æŒ‰é”®
    /// </summary>
    public class Video : View
    {
        /// <summary>
        ///  å½“前视图
        /// </summary>
        /// <value>The android button.</value>
//        private AndroidSurfaceView surfaceView
//        {
//            get
//            {
//            return this.androidView as  AndroidSurfaceView;
//            }
//            set
//            {
//                this.androidView = value;
//            }
//        }
        public Video()
        {
//            this.surfaceView = new  AndroidSurfaceView (Application.Activity);
        }
        public void Start()
        {
//            this.surfaceView.Start ();
        }
        public string URL
        {
//            get
//            {
//                return this.surfaceView.URL;
//            }
            set
            {
                //this.surfaceView.URL = value;
            }
        }
        public void Stop()
        {
        }
    }
//    internal class AndroidSurfaceView:SurfaceView,OnBufferingUpdateListener, OnPreparedListener, MediaPlayer.IOnVideoSizeChangedListener, ISurfaceHolderCallback
//    {
//        private const string TAG = "MediaPlayerDemo";
//        private int mVideoWidth;
//        private int mVideoHeight;
//        private MediaPlayer mMediaPlayer;
//        private ISurfaceHolder holder;
//
//        private const string MEDIA = "media";
//        private const int LOCAL_AUDIO = 1;
//        private const int STREAM_AUDIO = 2;
//        private const int RESOURCES_AUDIO = 3;
//        private const int LOCAL_VIDEO = 4;
//        private const int STREAM_VIDEO = 5;
//        private bool mIsVideoSizeKnown = false;
//        private bool mIsVideoReadyToBePlayed = false;
//
//        public string URL="";
//
//        public AndroidSurfaceView (Context context, IAttributeSet attrs, int defStyleAttr, int defStyleRes):base(context,attrs,defStyleAttr,defStyleRes)
//        {
//
//        }
//
//        public AndroidSurfaceView (Context context, IAttributeSet attrs, int defStyleAttr):base(context,attrs,defStyleAttr){}
//
//        public AndroidSurfaceView (Context context, IAttributeSet attrs):base(context,attrs){}
//
//        public AndroidSurfaceView (Context context):base(context){
//            if (!LibsChecker.CheckVitamioLibs (Application.Activity)) {
//            }
//
//            holder = this.Holder;
//            holder.AddCallback(this);
//            holder.SetFormat(Format.Rgba8888);
//        }
//
//        protected AndroidSurfaceView (IntPtr javaReference, JniHandleOwnership transfer):base(javaReference,transfer){}
//
//        private void initPlayer()
//        {
//            try {
//                DoCleanUp ();
//
//                mMediaPlayer = new MediaPlayer (Application.Activity);
//                mMediaPlayer.SetDataSource (URL);
//                mMediaPlayer.SetDisplay (holder);
//                mMediaPlayer.PrepareAsync ();
//                mMediaPlayer.SetOnBufferingUpdateListener (this);
////                mMediaPlayer.SetOnCompletionListener (this);
//                mMediaPlayer.SetOnPreparedListener (this);
//                mMediaPlayer.SetOnVideoSizeChangedListener (this);
//
//            } catch (Exception e) {
//                Log.Error (TAG, "error: " + e.Message, e);
//            }
//        }
//
//        public virtual void OnBufferingUpdate(MediaPlayer arg0, int percent)
//        {
//            //Log.Info(TAG, "onBufferingUpdate percent:" + percent);
//
//        }
//
//        public virtual void OnVideoSizeChanged(MediaPlayer mp, int width, int height)
//        {
//            Log.Verbose(TAG, "onVideoSizeChanged called");
//            if (width == 0 || height == 0)
//            {
//                Log.Error(TAG, "invalid video width(" + width + ") or height(" + height + ")");
//                return;
//            }
//            mIsVideoSizeKnown = true;
//            mVideoWidth = width;
//            mVideoHeight = height;
//        }
//
//        public virtual void OnPrepared(MediaPlayer mediaplayer)
//        {
//            Log.Debug(TAG, "onPrepared called");
//            mIsVideoReadyToBePlayed = true;
//        }
//
//        public virtual void SurfaceChanged(ISurfaceHolder surfaceholder, int i, int j, int k)
//        {
//            Log.Debug(TAG, "surfaceChanged called");
//        }
//
//        public virtual void SurfaceDestroyed(ISurfaceHolder surfaceholder)
//        {
//            Log.Debug(TAG, "surfaceDestroyed called");
//        }
//
//        public virtual void SurfaceCreated(ISurfaceHolder holder)
//        {
//            Log.Debug(TAG, "surfaceCreated called");
//            initPlayer();
//        }
//
//        public void Close()
//        {
//            ReleaseMediaPlayer();
//            DoCleanUp();
//        }
//
//        private void ReleaseMediaPlayer()
//        {
//            if (mMediaPlayer != null)
//            {
//                mMediaPlayer.Release();
//                mMediaPlayer = null;
//            }
//        }
//
//        private void DoCleanUp()
//        {
//            mVideoWidth = 0;
//            mVideoHeight = 0;
//            mIsVideoReadyToBePlayed = false;
//            mIsVideoSizeKnown = false;
//        }
//
//        public void Start()
//        {
//        if (mIsVideoReadyToBePlayed && mIsVideoSizeKnown) {
//            Log.Info (TAG, "startVideoPlayback");
//            holder.SetFixedSize (mVideoWidth, mVideoHeight);
//            if (!b) {
//                b = true;
//                mMediaPlayer.Start ();
//            }
//        }
//    }
//
//        private bool b;
//
//        public void SurfaceChanged (ISurfaceHolder holder, Format format, int width, int height)
//        {
//            Log.Debug(TAG, "surfaceChanged called");
//        }
//
//    }
//
}
ZigbeeApp/Shared.Droid/UI/View.cs
New file
@@ -0,0 +1,1277 @@
using System;
using Android.Graphics.Drawables;
using Android.Graphics;
using Android.Views.Animations;
using Android.Views;
using Java.Lang.Ref;
using static Shared.HDLUtils;
using Android.OS;
namespace Shared
{
    /// <summary>
    /// æ ¹è§†å›¾
    /// </summary>
    internal class RootView : ViewGroup { }
    /// <summary>
    /// æ‰€æœ‰ç±»çš„基类
    /// </summary>
    public abstract class View
    {
        ~View()
        {
//#if DEBUG
            System.Console.WriteLine("=====" + GetType() + " " + Name);
//#endif
            if (this is ViewGroup)
            {
                var viewGroup = this as ViewGroup;
                if (viewGroup.realViewGroup != AndroidView)
                {
                    //foreach (var view in viewGroup.viewList)
                    //{
                    //    view.AndroidView.Dispose();
                    //}
                    viewGroup.realViewGroup?.Dispose();
                }
            }
            AndroidView?.Dispose();
        }
        /// <summary>
        /// æ˜¯å¦éœ€è¦æ›´æ–°æŽ§ä»¶
        /// </summary>
        /// <value>The is need refresh.</value>
        protected bool IsCanRefresh
        {
            get
            {
                View tempView = Parent;
                while (tempView != null)
                {
                    //根控件,找到根控件后说明已经成功加入了父控件
                    if (tempView.GetType() == typeof(RootView))
                    {
                        return true;
                    }
                    tempView = tempView.Parent;
                }
                return false;
            }
        }
        internal virtual void ClearAllViewEvent()
        {
            //try
            //{
            //    lock (dimageCached)
            //    {
            //        foreach (var key in dimageCached.KeySet())
            //        {
            //            var keyString = key.ToString();
            //            if (keyString.StartsWith($"{GetHashCode()}_", StringComparison.Ordinal))
            //            {
            //                dimageCached.Remove(keyString);
            //                System.Console.WriteLine("=====释放图片" + GetType() + " " + Name);
            //                (dimageCached.Get(keyString) as Drawable)?.Dispose();
            //                break;
            //            }
            //        }
            //    }
            //}
            //catch { }
        }
        internal virtual void InitAllViewEvent() { }
        /// <summary>
        /// å½“前对应的AndroidView控件
        /// </summary>
        public Android.Views.View AndroidView { get; set; }
        /// <summary>
        /// æ˜¯å¦ä½¿èƒ½
        /// </summary>
        /// <value>The enable.</value>
        public virtual bool Enable
        {
            get
            {
                return AndroidView.Enabled;
            }
            set
            {
                AndroidView.Enabled = value;
            }
        }
        int height = LayoutParams.MatchParent;
        /// <summary>
        /// æŽ§ä»¶çš„高度
        /// </summary>
        /// <value>The height.</value>
        public virtual int Height
        {
            get
            {
                return AndroidView.LayoutParameters == null ? height : AndroidView.LayoutParameters.Height;
            }
            set
            {
                height = value;
                if (!IsCanRefresh)
                    return;
                var layoutParameters = AndroidView.LayoutParameters;
                if (value == LayoutParams.MatchParent)
                {
                    if (layoutParameters.Height != Parent.Height)
                    {
                        layoutParameters.Height = Parent.Height;
                        AndroidView.LayoutParameters = layoutParameters;
                        SizeChangeEventHandler?.Invoke(this, new Size(layoutParameters.Width, layoutParameters.Height));
                    }
                }
                else
                {
                    if (layoutParameters.Height != value)
                    {
                        layoutParameters.Height = value;
                        AndroidView.LayoutParameters = layoutParameters;
                        SizeChangeEventHandler?.Invoke(this, new Size(layoutParameters.Width, layoutParameters.Height));
                    }
                }
            }
        }
        int width = LayoutParams.MatchParent;
        /// <summary>
        /// æŽ§ä»¶å®½åº¦
        /// </summary>
        /// <value>The width.</value>
        public virtual int Width
        {
            get
            {
                return AndroidView.LayoutParameters == null ? width : AndroidView.LayoutParameters.Width;
            }
            set
            {
                width = value;
                if (!IsCanRefresh)
                    return;
                var layoutParameters = AndroidView.LayoutParameters;
                if (value == LayoutParams.MatchParent)
                {
                    if (layoutParameters.Width != Parent.Width)
                    {
                        layoutParameters.Width = Parent.Width;
                        AndroidView.LayoutParameters = layoutParameters;
                        SizeChangeEventHandler?.Invoke(this, new Size(layoutParameters.Width, layoutParameters.Height));
                    }
                }
                else
                {
                    if (layoutParameters.Width != value)
                    {
                        layoutParameters.Width = value;
                        AndroidView.LayoutParameters = layoutParameters;
                        SizeChangeEventHandler?.Invoke(this, new Size(layoutParameters.Width, layoutParameters.Height));
                    }
                }
            }
        }
        /// <summary>
        /// åˆ·æ–°ç•Œé¢
        /// </summary>
        public virtual void Refresh()
        {
            Width = width;
            Height = height;
            Gravity = gravity;
            Animate = animate;
            Radius = tempRadius;
        }
        /// <summary>
        /// åç§°
        /// </summary>
        /// <value>The name.</value>
        public string Name { get; set; }
        int x;
        /// <summary>
        /// X轴坐标
        /// </summary>
        /// <value>The x.</value>
        public int X
        {
            get
            {
                return (int)AndroidView.GetX();
            }
            set
            {
                x = value;
                if (!IsCanRefresh)
                {
                    return;
                }
                if (Parent.GetType() == typeof(HorizontalScrolViewLayout))
                {
                    return;
                }
                else
                {
                    AndroidView.SetX(value);
                }
            }
        }
        int y;
        /// <summary>
        /// Y轴坐标
        /// </summary>
        /// <value>The y.</value>
        public int Y
        {
            get
            {
                return (int)AndroidView.GetY();
            }
            set
            {
                y = value;
                if (!IsCanRefresh)
                {
                    return;
                }
                if (Parent.GetType() == typeof(VerticalScrolViewLayout))
                {
                    return;
                }
                else
                {
                    AndroidView.SetY(value);
                }
            }
        }
        Gravity gravity = Gravity.Frame;
        /// <summary>
        /// æŽ§ä»¶ç›¸å¯¹äºŽçˆ¶æŽ§ä»¶çš„对齐方式
        /// </summary>
        /// <value>The gravity.</value>
        public Gravity Gravity
        {
            get
            {
                return gravity;
            }
            set
            {
                gravity = value;
                if (!IsCanRefresh)
                {
                    return;
                }
                switch (value)
                {
                    case Gravity.TopLeft:
                        X = 0;
                        Y = 0;
                        break;
                    case Gravity.TopCenter:
                        X = (Parent.Width - Width) / 2;
                        Y = 0;
                        break;
                    case Gravity.TopRight:
                        X = Parent.Width - Width;
                        Y = 0;
                        break;
                    case Gravity.CenterLeft:
                        X = 0;
                        Y = (Parent.Height - Height) / 2;
                        break;
                    case Gravity.Center:
                        X = (Parent.Width - Width) / 2;
                        Y = (Parent.Height - Height) / 2;
                        break;
                    case Gravity.CenterRight:
                        X = Parent.Width - Width;
                        Y = (Parent.Height - Height) / 2;
                        break;
                    case Gravity.BottomLeft:
                        X = 0;
                        Y = Parent.Height - Height;
                        break;
                    case Gravity.BottomCenter:
                        X = (Parent.Width - Width) / 2;
                        Y = Parent.Height - Height;
                        break;
                    case Gravity.BottomRight:
                        X = Parent.Width - Width;
                        Y = Parent.Height - Height;
                        break;
                    case Gravity.CenterVertical:
                        X = x;
                        Y = (Parent.Height - Height) / 2;
                        break;
                    case Gravity.CenterHorizontal:
                        X = (Parent.Width - Width) / 2;
                        Y = y;
                        break;
                    case Gravity.Frame:
                        X = x;
                        Y = y;
                        break;
                }
            }
        }
        /// <summary>
        /// å·¦è¾¹çº¿ä½ç½®
        /// </summary>
        /// <value>The bottom.</value>
        public int Bottom
        {
            get
            {
                return Height + Y;
            }
        }
        /// <summary>
        ///  å³è¾¹çº¿ä½ç½®
        /// </summary>
        /// <value>The right.</value>
        public int Right
        {
            get
            {
                return Width + X;
            }
        }
        /// <summary>
        /// å½“前窗口大小及位置
        /// </summary>
        /// <value>The frame.</value>
        public virtual Size Size
        {
            get
            {
                return new Size(Width, Height);
            }
            set
            {
                Width = value.Width;
                Height = value.Height;
            }
        }
        /// <summary>
        /// çˆ¶å®¹å™¨
        /// </summary>
        /// <value>The parent.</value>
        public ViewGroup Parent { get; internal set; }
        /// <summary>
        /// å¤„理点击代理
        /// </summary>
        /// <param name="sender">Sender.</param>
        /// <param name="e">E.</param>
        internal virtual bool TouchEvent(MotionEvent e)
        {
            if (!this.Enable)
            {
                return false;
            }
            switch (e.Action)
            {
                case MotionEventActions.Down:
                    isUp = false;
                    longClicked = false;
                    MouseDownEventHandler?.Invoke(this, new MouseEventArgs { X = (int)e.GetX(), Y = (int)e.GetY() });
                    if (MouseLongEventHandler != null)
                    {
                        try
                        {
                            if (thread != null && thread.IsAlive)
                            {
                                thread.Abort();
                            }
                            thread = new System.Threading.Thread(() =>
                            {
                                System.Threading.Thread.Sleep(800);
                                //System.Console.WriteLine("=====" + isUp);
                                if (!isUp)
                                {
                                    longClicked = true;
                                    Application.RunOnMainThread(() =>
                                    {
                                        MouseLongEventHandler(this, new MouseEventArgs { X = (int)e.GetX(), Y = (int)e.GetY() });
                                    });
                                }
                            })
                            { IsBackground = true };
                            thread.Start();
                        }
                        catch { }
                    }
                    break;
                case MotionEventActions.Move:
                    MouseMoveEventHandler?.Invoke(this, new MouseEventArgs { X = (int)e.GetX(), Y = (int)e.GetY() });
                    break;
                case MotionEventActions.Up:
                    isUp = true;
                    if (!longClicked && isTouchPointInView(AndroidView, e.RawX, e.RawY))
                    {
                        MouseUpEventHandler?.Invoke(this, new MouseEventArgs { X = (int)e.GetX(), Y = (int)e.GetY() });
                    }
                    break;
                case MotionEventActions.Cancel:
                    isUp = true;
                    break;
            }
            return true;
        }
        private bool isTouchPointInView(Android.Views.View targetView, float xAxis, float yAxis)
        {
            if (targetView == null)
            {
                return false;
            }
            var location = new int[2];
            targetView.GetLocationOnScreen(location);
            int left = location[0];
            int top = location[1];
            int right = left + targetView.Width;
            int bottom = top + targetView.Height;
            if (yAxis >= top && yAxis <= bottom && xAxis >= left
                    && xAxis <= right)
            {
                return true;
            }
            return false;
        }
        bool isUp ;
        bool longClicked;
        /// <summary>
        /// ç‚¹å‡»æŒ‰ä¸‹äº‹ä»¶
        /// </summary>
        public EventHandler<MouseEventArgs> MouseDownEventHandler;
        /// <summary>
        /// æŽ§ä»¶ä¸Šç§»åŠ¨äº‹ä»¶
        /// </summary>
        public EventHandler<MouseEventArgs> MouseMoveEventHandler;
        /// <summary>
        /// ç‚¹å‡»å¼¹èµ·äº‹ä»¶
        /// </summary>
        public EventHandler<MouseEventArgs> MouseUpEventHandler;
        System.Threading.Thread thread;
        /// <summary>
        /// é•¿æŒ‰ç‚¹å‡»äº‹ä»¶
        /// </summary>
        public EventHandler<MouseEventArgs> MouseLongEventHandler;
        /// <summary>
        /// å¤§å°å˜åŒ–事件
        /// </summary>
        public EventHandler<Size> SizeChangeEventHandler;
        /// <summary>
        /// å°†æŽ§åˆ¶ç§»åˆ°æœ€å‰
        /// </summary>
        public virtual void BringToFront()
        {
            AndroidView.BringToFront();
        }
        Animate animate = Animate.None;
        /// <summary>
        /// åŠ¨ç”»æ–¹å¼
        /// </summary>
        /// <value>The animate.</value>
        public Animate Animate
        {
            get
            {
                return animate;
            }
            set
            {
                animate = value;
                if (!IsCanRefresh)
                {
                    return;
                }
                AndroidView.ClearAnimation();
                switch (animate)
                {
                    case Animate.DownToUp:
                        {
                            AndroidView.Animation = new TranslateAnimation(
                                Dimension.RelativeToSelf, 0,
                                Dimension.RelativeToSelf, 0,
                                Dimension.RelativeToSelf, 1.0f,
                                Dimension.RelativeToSelf, 0)
                            { Duration = 500 }; // 13828497568
                            AndroidView.Animation.StartNow();
                        }
                        break;
                    case Animate.UpToDown:
                        {
                            AndroidView.Animation = new TranslateAnimation(
                                Dimension.RelativeToSelf, 0,
                                Dimension.RelativeToSelf, 0,
                                Dimension.RelativeToSelf, -1.0f,
                                Dimension.RelativeToSelf, 0)
                            { Duration = 500 };
                            AndroidView.Animation.StartNow();
                        }
                        break;
                    case Animate.LeftToRight:
                        {
                            AndroidView.Animation = new TranslateAnimation(
                                Dimension.RelativeToSelf, -1.0f,
                                Dimension.RelativeToSelf, 0,
                                Dimension.RelativeToSelf, 0f,
                                Dimension.RelativeToSelf, 0)
                            { Duration = 500 };
                            AndroidView.Animation.StartNow();
                        }
                        break;
                    case Animate.RightToLeft:
                        {
                            AndroidView.Animation = new TranslateAnimation(
                               Dimension.RelativeToSelf, 1.0f,
                               Dimension.RelativeToSelf, 0,
                               Dimension.RelativeToSelf, 0f,
                                Dimension.RelativeToSelf, 0)
                            { Duration = 500 };
                            AndroidView.Animation.StartNow();
                        }
                        break;
                    case Animate.Rotation:
                        {
                            AndroidView.Animation = new RotateAnimation(
                                0,
                                359,
                                X + Width / 2.0f,
                                Y + Height / 2.0f
                            )
                            { Duration = 16000, RepeatCount = -1 };
                            AndroidView.Animation.StartNow();
                        }
                        break;
                }
            }
        }
        static Java.Util.HashMap dimageCached = new Java.Util.HashMap();
        /// <summary>
        /// è®¾å¤‡æŽ§ä»¶èƒŒæ™¯å›¾
        /// </summary>
        /// <param name="filePath"></param>
        protected bool Background(string filePath)
        {
            try
            {
                var drawable = getDrawable(filePath);
                if (this.GetType() == typeof(ImageView))
                {
                    (AndroidView as AndroidImageView).SetImageDrawable(drawable);
                }
                else
                {
                    AndroidView.Background = drawable;
                }
                if (null != drawable)
                {
                    return true;
                }
            }
            catch { }
            return false;
        }
        protected bool Background(string filePath, Android.Views.View view)
        {
            AndroidView.Background = getDrawable(filePath);
            if (null == view.Background)
            {
                return false;
            }
            else
            {
                return true;
            }
        }
        protected Drawable Bytes2Drawable(byte[] b)
        {
            var bitmap = Bytes2Bitmap(b);
            return bitmap2Drawable(bitmap);
        }
        protected Drawable bitmap2Drawable(Bitmap bitmap)
        {
            return new BitmapDrawable(bitmap);
        }
        // byte[]转换成Bitmap
        protected Bitmap Bytes2Bitmap(byte[] b)
        {
            if (b.Length != 0)
            {
                return BitmapFactory.DecodeByteArray(b, 0, b.Length);
            }
            return null;
        }
        Drawable getDrawable(string filePath)
        {
            try
            {
                if (filePath == null)
                {
                    return null;
                }
                var newFilePath = IO.FileUtils.GetImageFilePath(filePath);
                if (string.IsNullOrEmpty(newFilePath))
                {
                    AndroidView.Background = null;
                    return null;
                }
                var mappingPath = "";// $"{this.GetHashCode()}_";
                if (AndroidView.LayoutParameters != null)
                {
                    mappingPath += AndroidView.LayoutParameters.Width + "-" + AndroidView.LayoutParameters.Height + "-";
                }
                mappingPath += newFilePath;
                //lock (dimageCached)
                {
                    if (dimageCached.ContainsKey(mappingPath) && dimageCached.Get(mappingPath) != null)
                    {
                        return (Drawable)dimageCached.Get(mappingPath);
                    }
                }
                //System.Console.WriteLine(dimageCached.Size() + "  ");
                var tempBitmapUtiles = AndroidDrawableUtiles.GetAndroidDrawableUtiles(newFilePath, Width, Height);
                //加载二次
                if (null == tempBitmapUtiles)
                {
                    tempBitmapUtiles = AndroidDrawableUtiles.GetAndroidDrawableUtiles(newFilePath, Width, Height);
                }
                //两次加载图片都失败,直接返回
                if (null == tempBitmapUtiles)
                {
                    AndroidView.Background = null;
                    return null;
                }
                //if (mappingPath.Contains("/Room/") || mappingPath.Contains("/Scene/"))
                //{
                //    return tempBitmapUtiles.Drawable;
                //}
                //lock (dimageCached)
                {
                    try
                    {
                        if (dimageCached.ContainsKey(mappingPath))
                        {
                            dimageCached.Remove(mappingPath);
                            dimageCached.Put(mappingPath, tempBitmapUtiles.Drawable);
                        }
                        else
                        {
                            dimageCached.Put(mappingPath, tempBitmapUtiles.Drawable);
                        }
                        return tempBitmapUtiles.Drawable;
                    }
                    catch
                    {
                        return null;
                    }
                }
            }
            catch {
                return null;
            }
        }
        /// <summary>
        /// å†…边距
        /// </summary>
        /// <value>The padding.</value>
        public virtual Padding Padding
        {
            get;
            set;
        }
        /// <summary>
        /// æ–¹ä¾¿å¼€å‘者开发
        /// </summary>
        public object Tag;
        System.Collections.Generic.Dictionary<string, object> tag;
        /// <summary>
        /// å¢žåР键值坹
        /// </summary>
        /// <param name="key">Key.</param>
        /// <param name="value">Value.</param>
        public void AddTag(string key, object value)
        {
            if (tag == null)
            {
                tag = new System.Collections.Generic.Dictionary<string, object>();
            }
            tag.Remove(key);
            tag.Add(key, value);
        }
        /// <summary>
        /// åˆ é™¤æŒ‡å®šé”®å€¼å¯¹
        /// </summary>
        /// <param name="key">Key.</param>
        public void RemoveTag(string key)
        {
            if (tag == null)
            {
                return;
            }
            tag.Remove(key);
        }
        /// <summary>
        /// æ ¹æ®é”®èŽ·å–å€¼
        /// </summary>
        /// <returns>The tag by key.</returns>
        /// <param name="key">Key.</param>
        public object GetTagByKey(string key)
        {
            if (tag == null)
            {
                return null;
            }
            object value;
            tag.TryGetValue(key, out value);
            return value;
        }
        /// <summary>
        /// å…¨éƒ¨åˆ é™¤Tag
        /// </summary>
        /// <returns>The tag.</returns>
        public void ClearTag()
        {
            if (tag != null)
            {
                tag.Clear();
            }
        }
        /// <summary>
        /// æ˜¯å¦æ˜¾ç¤º
        /// </summary>
        /// <value><c>true</c> if visible; otherwise, <c>false</c>.</value>
        public bool Visible
        {
            get
            {
                if (AndroidView.Visibility == Android.Views.ViewStates.Visible)
                {
                    return true;
                }
                else
                {
                    return false;
                }
            }
            set
            {
                if (value)
                {
                    AndroidView.Visibility = Android.Views.ViewStates.Visible;
                }
                else
                {
                    AndroidView.Visibility = Android.Views.ViewStates.Invisible;
                }
            }
        }
        /// <summary>
        /// ä»Žçˆ¶è§†å›¾ä¸­ç§»é™¤
        /// </summary>
        public virtual void RemoveFromParent()
        {
            if (Parent == null)
            {
                return;
            }
            Parent.Remove(this);
        }
        /// <summary>
        ///  é€æ˜Žåº¦è®¾ç½®
        /// </summary>
        /// <value>The alpha.</value>
        public float Alpha
        {
            get
            {
                return AndroidView.Alpha;
            }
            set
            {
                AndroidView.Alpha = value;
            }
        }
        uint backgroundColor;
        /// <summary>
        /// èƒŒæ™¯é¢œè‰²
        /// </summary>
        /// <value>The color of the background.</value>
        public virtual uint BackgroundColor
        {
            get
            {
                return backgroundColor;
            }
            set
            {
                backgroundColor = value;
                if (this.GetType() != typeof(ImageView))
                {
                    if (AndroidView.Background == null || AndroidView.Background.GetType() != typeof(GradientDrawable))
                    {
                        AndroidView.Background = new Android.Graphics.Drawables.GradientDrawable();
                    }
                    var gradientDrawable = (GradientDrawable)AndroidView.Background;
                    //gradientDrawable.SetCornerRadius(DensityUtil.Dip2Px(Radius));
                    if (IsSetAloneRadius)
                    {
                        gradientDrawable.SetCornerRadii(GetCornerRadii());
                    }
                    else {
                        gradientDrawable.SetCornerRadius(DensityUtil.Dip2Px(Radius));
                    }
                    byte r, g, b, a;
                    r = (byte)(BorderColor / 256 / 256 % 256);
                    g = (byte)(BorderColor / 256 % 256);
                    b = (byte)(BorderColor % 256);
                    a = (byte)(BorderColor / 256 / 256 / 256 % 256);
                    gradientDrawable.SetStroke((int)BorderWidth, Android.Graphics.Color.Argb(a, r, g, b));
                    r = (byte)(backgroundColor / 256 / 256 % 256);
                    g = (byte)(backgroundColor / 256 % 256);
                    b = (byte)(backgroundColor % 256);
                    a = (byte)(backgroundColor / 256 / 256 / 256 % 256);
                    gradientDrawable.SetColor(Android.Graphics.Color.Argb(a, r, g, b).ToArgb());
                }
            }
        }
        /// <summary>
        /// èŽ·å–æŒ‡å®šåœ†è§’å±žæ€§
        /// </summary>
        /// <value>The corner.</value>
        private float[] GetCornerRadii()
        {
            float[] mCornerRadius = new float[8];
            mCornerRadius[0] = topLeftRadius;
            mCornerRadius[1] = topLeftRadius;
            mCornerRadius[2] = topRightRadius;
            mCornerRadius[3] = topRightRadius;
            mCornerRadius[4] = bottomRightRadius;
            mCornerRadius[5] = bottomRightRadius;
            mCornerRadius[6] = bottomLeftRadius;
            mCornerRadius[7] = bottomLeftRadius;
            return mCornerRadius;
        }
        //是否单独设置圆角
        private bool IsSetAloneRadius;
        //4个圆角分别对应的值
        float topLeftRadius, topRightRadius, bottomLeftRadius, bottomRightRadius;
        float mAloneRadius;
        float mRadiusId;
        /// <summary>
        /// æŒ‡å®šä½ç½® è®¾ç½®ç›¸åŒçš„圆角
        /// </summary>
        public void SetCornerWithSameRadius(float mRadius, int mSetID)
        {
            try
            {
                mAloneRadius = DensityUtil.Dip2Px(mRadius);
                IsSetAloneRadius = true;
                mRadiusId = mSetID;
                topLeftRadius = (mSetID & 1) == 1 ? mAloneRadius : 0;
                topRightRadius = (mSetID >> 1 & 1) == 1 ? mAloneRadius : 0;
                bottomLeftRadius = (mSetID >> 2 & 1) == 1 ? mAloneRadius : 0;
                bottomRightRadius = (mSetID >> 3 & 1) == 1 ? mAloneRadius : 0;
                BackgroundColor = backgroundColor;
            }
            catch
            {
            }
        }
        internal uint radius, tempRadius;
        /// <summary>
        /// åœ†è§’大小
        /// </summary>
        /// <value>The corner.</value>
        public virtual uint Radius
        {
            get
            {
                return radius;
            }
            set
            {
                IsSetAloneRadius = false;
                tempRadius = value;
                if (!IsCanRefresh || Radius == value)
                {
                    return;
                }
                radius = value;
                BackgroundColor = backgroundColor;
            }
        }
        uint borderWidth;
        /// <summary>
        /// è¾¹æ¡†çº¿å¤§å°
        /// </summary>
        /// <value>The width of the border.</value>
        public uint BorderWidth
        {
            get
            {
                return borderWidth;
            }
            set
            {
                borderWidth = value;
                BackgroundColor = backgroundColor;
            }
        }
        uint borderColor = 0xFFCCCCCC;
        /// <summary>
        /// è¾¹æ¡†é¢œè‰²
        /// </summary>
        /// <value>The color of the border.</value>
        public uint BorderColor
        {
            get
            {
                return borderColor;
            }
            set
            {
                borderColor = value;
                BackgroundColor = backgroundColor;
            }
        }
        protected int Dip2Px(float dpValue)
        {
            float scale = Application.Activity.Resources.DisplayMetrics.Density;
            return (int)(dpValue * scale + 0.5f);
        }
        /// <summary>
        /// æ—‹è½¬View
        /// </summary>
        /// <value>旋转角度</value>
        public void SetRotation(float mRotation)
        {
            AndroidView.Rotation = mRotation;
        }
        /// <summary>
        /// è®¾ç½®é˜´å½±æ•ˆæžœ
        /// </summary>
        /// <value>是否显示阴影</value>
        public void SetViewShadow(bool bShow, float mOffsetY = 5.0f)
        {
            if((int)Build.VERSION.SdkInt >= 21)
            {
                AndroidView.TranslationZ = bShow ? Dip2Px(mOffsetY) : 0;
            }
        }
    }
    public class Size
    {
        /// <summary>
        /// Initializes a new instance of the <see cref="Shared.Frame"/> class.
        /// </summary>
        /// <param name="x">Xè½´</param>
        /// <param name="y">Yè½´</param>
        /// <param name="width">宽度</param>
        /// <param name="height">高度</param>
        public Size(int width, int height)
        {
            Width = width;
            Height = height;
        }
        /// <summary>
        /// å®½åº¦
        /// </summary>
        public int Width
        {
            get;
            set;
        }
        /// <summary>
        /// é«˜åº¦
        /// </summary>
        public int Height
        {
            get;
            set;
        }
    }
    /// <summary>
    /// å†…边距
    /// </summary>
    public class Padding
    {
        public Padding(int top, int left, int bottom, int right)
        {
            Top = top;
            Left = left;
            Bottom = bottom;
            Right = right;
        }
        /// <summary>
        /// é¡¶éƒ¨
        /// </summary>
        public int Top
        {
            get;
            set;
        }
        /// <summary>
        /// å·¦è¾¹
        /// </summary>
        public int Left
        {
            get;
            set;
        }
        /// <summary>
        /// åº•部
        /// </summary>
        public int Bottom
        {
            get;
            set;
        }
        /// <summary>
        /// å³è¾¹
        /// </summary>
        public int Right
        {
            get;
            set;
        }
    }
    internal class AndroidDrawableUtiles
    {
        /// <summary>
        /// å›¾ç‰‡å¯¹è±¡
        /// </summary>
        public Drawable Drawable;
        /// <summary>
        /// å›¾ç‰‡çš„高度
        /// </summary>
        public int Height;
        /// <summary>
        /// å›¾ç‰‡çš„宽度
        /// </summary>
        public int Width;
        /// <summary>
        /// Initializes a new instance of the <see cref="Shared.AndroidDrawableUtiles"/> class.
        /// </summary>
        /// <param name="bitmapDrawable">Bitmap drawable.</param>
        /// <param name="height">Height.</param>
        /// <param name="width">Width.</param>
        public AndroidDrawableUtiles(Drawable bitmapDrawable, int height, int width)
        {
            Drawable = bitmapDrawable;
            Height = height;
            Width = width;
        }
        static Bitmap readBitmapFromFileDescriptor(string filePath, int width, int height)
        {
            try
            {
                var fis = new Java.IO.FileInputStream(filePath);
                var options = new BitmapFactory.Options();
                options.InJustDecodeBounds = true;
                BitmapFactory.DecodeFileDescriptor(fis.FD, null, options);
                float srcWidth = options.OutWidth;
                float srcHeight = options.OutHeight;
                int inSampleSize = 1;
                if (srcHeight > height || srcWidth > width)
                {
                    if (srcWidth > srcHeight)
                    {
                        inSampleSize = (int)Math.Round(srcHeight / height);
                    }
                    else
                    {
                        inSampleSize = (int)Math.Round(srcWidth / width);
                    }
                }
                options.InJustDecodeBounds = false;
                options.InSampleSize = inSampleSize;
                return (Bitmap)new SoftReference(BitmapFactory.DecodeFileDescriptor(fis.FD, null, options)).Get();
            }
            catch (Exception ex)
            {
            }
            return null;
        }
        public static AndroidDrawableUtiles GetAndroidDrawableUtiles(string filePath, int width, int height)
        {
            var bitmap = readBitmapFromFileDescriptor(filePath, width, height);
            //BitmapFactory.Options options = new BitmapFactory.Options();
            //options.InJustDecodeBounds = true;
            //BitmapFactory.DecodeFile(filePath, options);
            ////图片不存在,直接返回
            //if (0 == options.OutWidth || 0 == options.OutHeight)
            //{
            //    System.Console.WriteLine(filePath+"找不到");
            //    return null;
            //}
            //options.InSampleSize = getFitInSampleSize(width, height, options);
            //options.InJustDecodeBounds = false;
            //var bitmap = BitmapFactory.DecodeFile(filePath, options);
            //var drawable = new BitmapDrawable(bitmap);
            //if (drawable.Bitmap != bitmap && !bitmap.IsRecycled)
            //{
            //    System.Console.WriteLine("释放图片资源:" + filePath);
            //    bitmap.Recycle();
            //}
            //var drawable = new BitmapDrawable(bitmap);
            if (bitmap == null)
            {
                return new AndroidDrawableUtiles(null, bitmap.Width, bitmap.Height);
            }
            else
            {
                return new AndroidDrawableUtiles((BitmapDrawable)new SoftReference(new BitmapDrawable(bitmap)).Get(), bitmap.Width, bitmap.Height);
            }
        }
        static int getFitInSampleSize(int reqWidth, int reqHeight, BitmapFactory.Options options)
        {
            int inSampleSize = 1;
            if (options.OutWidth > reqWidth || options.OutHeight > reqHeight)
            {
                int widthRatio = (int)Math.Round(options.OutWidth * 1.0 / reqWidth);
                int heightRatio = (int)Math.Round(options.OutHeight * 1.0 / reqHeight);
                inSampleSize = Math.Min(widthRatio, heightRatio);
            }
            return inSampleSize;
        }
    }
    /// <summary>
    /// ç‚¹å‡»æ—¶åŸºæœ¬å‚æ•°
    /// </summary>
    public class MouseEventArgs : EventArgs
    {
        /// <summary>
        /// X坐标
        /// </summary>
        public float X;
        /// <summary>
        /// Y坐标
        /// </summary>
        public float Y;
    }
    public class AndroidView
    {
        //是否是活动状态
        public static bool IsLive(Android.Views.View view)
        {
            return view.Enabled && view.Visibility == ViewStates.Visible && 0 < view.Alpha;
        }
    }
}
ZigbeeApp/Shared.Droid/UI/ViewGroup.cs
New file
@@ -0,0 +1,270 @@
using System;
namespace Shared
{
    /// <summary>
    /// Button æŒ‰é”®
    /// </summary>
    public class ViewGroup : View
    {
        /// <summary>
        /// çœŸæ­£çš„容器
        /// </summary>
        internal Android.Views.ViewGroup realViewGroup;
        /// <summary>
        /// å½“前控件
        /// </summary>
        /// <value>The android frame layout.</value>
        internal Android.Views.ViewGroup viewGroup
        {
            get
            {
                return AndroidView as Android.Views.ViewGroup;
            }
            set
            {
                AndroidView = value;
            }
        }
        /// <summary>
        /// å¢žåŠ å­æŽ§ä»¶
        /// </summary>
        /// <param name="view">View.</param>
        public virtual void AddChidren(View view)
        {
            view.Parent = this;
            viewList.Add(view);
            if (GetType () == typeof (VerticalScrolViewLayout)) {
                //这个是为了填充的
                if (0<realViewGroup.ChildCount&&realViewGroup.GetChildAt (realViewGroup.ChildCount - 1).Tag != null&&realViewGroup.GetChildAt (realViewGroup.ChildCount - 1).Tag.ToString()=="填充") {
                    realViewGroup.RemoveViewAt (realViewGroup.ChildCount - 1);
                }
            }
            if(view.AndroidView.Parent!=null){
                (view.AndroidView.Parent as Android.Views.ViewGroup)?.RemoveView(view.AndroidView);
            }
            realViewGroup.AddView(view.AndroidView);
            if (!IsCanRefresh)
            {
                return;
            }
            view.Refresh();
            if (view is GestureLockView) {
                new System.Threading.Thread(() =>
                {
                    System.Threading.Thread.Sleep(100);
                    Shared.Application.RunOnMainThread(() =>
                    {
                        (view as GestureLockView).Height = view.Height+1;
                        (view as GestureLockView).Height = view.Height - 1;
                    });
                }).Start();
            }
            //如果父控件是这种,就在最后补上一个控件
            if (GetType () == typeof (VerticalScrolViewLayout)) {
                int tempHeight = -10;
                foreach (var temp in viewList) {
                    tempHeight += temp.Height;
                }
                realViewGroup.AddView (new Android.Widget.LinearLayout (Application.Activity) { Tag = "填充" }, new Android.Views.ViewGroup.LayoutParams (Android.Views.ViewGroup.LayoutParams.MatchParent, tempHeight < realViewGroup.LayoutParameters.Height ? realViewGroup.LayoutParameters.Height - tempHeight:0));
            }
            addParentToAllSubViews(view);
            if (view is ViewGroup)
            {
                var tempViewGroup = (ViewGroup)view;
                for (int i = 0; i < tempViewGroup.ChildrenCount; i++)
                {
                    tempViewGroup.GetChildren(i).Refresh();
                }
            }
        }
        internal void addParentToAllSubViews(View view)
        {
            if (view is ViewGroup)
            {
                var viewgroup = view as ViewGroup;
                for (int i = 0; i < viewgroup.viewList.Count; i++)
                {
                    var _view = viewgroup.viewList[i];
                    if (_view == null) continue;
                    _view.Parent = viewgroup;
                    addParentToAllSubViews(_view);//递归,将子控件所包含的控件也一并移除;
                }
            }
        }
        /// <summary>
        /// æŽ§ä»¶æ•°é‡
        /// </summary>
        /// <value>The children count.</value>
        public int ChildrenCount { get { return viewList.Count; } }
        /// <summary>
        /// æŽ§ä»¶åˆ—表
        /// </summary>
        internal System.Collections.Generic.List<View> viewList = new System.Collections.Generic.List<View>();
        string backgroundImagePath;
        /// <summary>
        /// èƒŒæ™¯å›¾ç‰‡
        /// </summary>
        /// <value>The background image path.</value>
        public virtual string BackgroundImagePath
        {
            get
            {
                return backgroundImagePath;
            }
            set
            {
                backgroundImagePath = value;
                if (!IsCanRefresh || null == backgroundImagePath || Radius != 0)
                {
                    return;
                }
                if (Background(backgroundImagePath))
                {
                }
            }
        }
        /// <summary>
        /// åˆ·æ–°ç•Œé¢
        /// </summary>
        public override void Refresh()
        {
            base.Refresh();
            BackgroundImagePath = backgroundImagePath;
        }
        /// <summary>
        /// ç§»é™¤æŽ§ä»¶
        /// </summary>
        /// <param name="view">View.</param>
        internal virtual void Remove(View view)
        {
            if (view == null)
            {
                return;
            }
            viewList.Remove(view);
            realViewGroup.RemoveView(view.AndroidView);
            view.Parent = null;
        }
        internal virtual void removeChildParent()
        {
            for (int i = 0; i < viewList.Count; i++)
            {
                var view = viewList[i];
                if (view == null) continue;
                if (view is ViewGroup)
                {
                    (view as ViewGroup).removeChildParent();
                }
                view.Parent = null;
                //lock (dimageCached)
                //{
                //    foreach (var keyValue in dimageCached)
                //    {
                //        if (keyValue.Key.StartsWith(view.GetHashCode() + "_", StringComparison.Ordinal))
                //        {
                //            dimageCached.Remove(keyValue.Key);
                //            keyValue.Value.Dispose();
                //            break;
                //        }
                //    }
                //}
            }
        }
        public override void RemoveFromParent()
        {
            removeChildParent();
            base.RemoveFromParent();
        }
        /// <summary>
        /// æ¸…空所有的控件
        /// </summary>
        public virtual void RemoveAll()
        {
            while (0 < viewList.Count)
            {
                //Remove(GetChildren(0));
                GetChildren(0)?.RemoveFromParent();
            }
        }
        /// <summary>
        /// ç§»é™¤æŒ‡å®šç´¢å¼•对象
        /// </summary>
        /// <param name="index">Index.</param>
        public virtual void RemoveAt(int index)
        {
            //Remove(GetChildren(index));
            GetChildren(index)?.RemoveFromParent();
        }
        /// <summary>
        /// èŽ·å–æŒ‡å®šç´¢å¼•å¯¹è±¡
        /// </summary>
        /// <returns>The children.</returns>
        /// <param name="index">Index.</param>
        public View GetChildren(int index)
        {
            if (viewList.Count - 1 < index || index < 0)
            {
                return null;
            }
            return viewList[index];
        }
        /// <summary>
        /// æ ¹æ®ç±»åž‹ç§»é™¤æŽ§ä»¶
        /// </summary>
        /// <param name="type">Type.</param>
        public void RemoveViewByType(System.Type type){
            for (int i = 0; i < viewList.Count;i++)
            {
                if(viewList[i].GetType()==type)
                {
                    viewList[i].RemoveFromParent();
                    i--;
                }
            }
        }
        /// <summary>
        /// æ ¹æ®Tag移除控件
        /// </summary>
        /// <param name="type">Type.</param>
        public void RemoveViewByTag(object tag)
        {
            for (int i = 0; i < viewList.Count; i++)
            {
                if (viewList[i].Tag == tag)
                {
                    viewList[i].RemoveFromParent();
                    i--;
                }
            }
        }
    }
}
ZigbeeApp/Shared.Droid/UI/WaveSeekBar.cs
New file
@@ -0,0 +1,331 @@
using System;
using Android.Runtime;
using Android.Views;
using Com.Hdl.Widget;
namespace Shared
{
    /// <summary>
    /// HDLWaveSeekBar æ³¢æµªæ»‘动控件
    /// </summary>
    public class WaveSeekBar : View
    {
        /// <summary>
        ///  å½“前视图
        /// </summary>
        /// <value>The HDLWaveSeekBar.</value>
        HDLWaveSeekBar mHDLWaveSeekBar
        {
            get
            {
                return AndroidView as HDLWaveSeekBar;
            }
            set
            {
                AndroidView = value;
            }
        }
        /// <summary>
        /// æž„造函数
        /// </summary>
        public WaveSeekBar()
        {
            mHDLWaveSeekBar = new HDLWaveSeekBar(Application.Activity);
            mOnProgressChangeListener = new OnProgressChangeListener(this);
            mHDLWaveSeekBar.SetOnProgressChangeListener(mOnProgressChangeListener);
        }
        //internal static ProgressChangeListener:Com.Hdl.Widget.HDLWaveSeekBar.IOnProgressChangeListener(){
        //}
        /// <summary>
        /// è¿›åº¦å€¼æ˜¾ç¤ºå•位
        /// </summary>
        /// <value>单位字符</value>
        public String ProgressBarUnitSring
        {
            set
            {
                mHDLWaveSeekBar.SetProgressBarUnitSring(value);
            }
        }
        /// <summary>
        /// è¿›åº¦å€¼æœ€å¤§å€¼
        /// </summary>
        /// <value>最大值</value>
        public int MaxValue
        {
            set
            {
                mHDLWaveSeekBar.SetMaxValue(value);
            }
        }
        /// <summary>
        /// è¿›åº¦å€¼æœ€å°å€¼
        /// </summary>
        /// <value>最小值</value>
        public int MinValue
        {
            set
            {
                mHDLWaveSeekBar.SetMinValue(value);
            }
        }
        /// <summary>
        /// å½“前进度值
        /// </summary>
        /// <value>进度值</value>
        public int Progress
        {
            set
            {
                mHDLWaveSeekBar.Progress = value;
            }
            get
            {
                return mHDLWaveSeekBar.Progress;
            }
        }
        /// <summary>
        /// å½“前进度值显示的文字颜色
        /// </summary>
        /// <value>文字颜色</value>
        public uint ProgressTextColor
        {
            set
            {
                byte r, g, b, a;
                r = (byte)(value / 256 / 256 % 256);
                g = (byte)(value / 256 % 256);
                b = (byte)(value % 256);
                a = (byte)(value / 256 / 256 / 256 % 256);
                mHDLWaveSeekBar.SetProgressTextColor(Android.Graphics.Color.Argb(a, r, g, b));
            }
        }
        /// <summary>
        /// å½“前进度值显示的文字大小
        /// </summary>
        /// <value>文字大小</value>
        public int ProgressTextSize
        {
            set => mHDLWaveSeekBar.SetProgressTextSize(value);
        }
        /// <summary>
        /// æ˜¯å¦å¯ä»¥æ»‘动
        /// </summary>
        /// <value>是否可以滑动</value>
        public bool IsClickable
        {
            set
            {
                mHDLWaveSeekBar.SetIsClickable(value);
            }
        }
        /// <summary>
        /// æ˜¯å¦å¯ä»¥æ»‘动
        /// </summary>
        /// <value>是否可以滑动</value>
        public bool IsProgressTextShow
        {
            set
            {
                mHDLWaveSeekBar.SetProgressTextShow(value);
            }
        }
        /// <summary>
        /// èƒŒæ™¯è¾¹æ¡†å®½åº¦
        /// </summary>
        /// <value>半径</value>
        public int WaveBorderWidth
        {
            set
            {
                mHDLWaveSeekBar.SetBorderWidth(value);
            }
        }
        /// <summary>
        /// åœ†è§’
        /// </summary>
        /// <value>圆角</value>
        public int CornerRadius
        {
            set
            {
                mHDLWaveSeekBar.SetCornerRadius(value);
            }
        }
        /// <summary>
        /// æ³¢æµªè¿›åº¦é¢œè‰²
        /// </summary>
        /// <value>波浪进度颜色</value>
        public uint WaveColor
        {
            set
            {
                byte r, g, b, a;
                r = (byte)(value / 256 / 256 % 256);
                g = (byte)(value / 256 % 256);
                b = (byte)(value % 256);
                a = (byte)(value / 256 / 256 / 256 % 256);
                mHDLWaveSeekBar.SetWaveColor(Android.Graphics.Color.Argb(a, r, g, b));
            }
        }
        /// <summary>
        /// èƒŒæ™¯è¾¹æ¡†é¢œè‰²
        /// </summary>
        /// <value>背景边框颜色</value>
        public uint WaveBorderColor
        {
            set
            {
                byte r, g, b, a;
                r = (byte)(value / 256 / 256 % 256);
                g = (byte)(value / 256 % 256);
                b = (byte)(value % 256);
                a = (byte)(value / 256 / 256 / 256 % 256);
                mHDLWaveSeekBar.SetWaveBorderColor(Android.Graphics.Color.Argb(a, r, g, b));
            }
        }
        ///// <summary>
        ///// è¿›åº¦åŒºåŸŸèƒŒæ™¯é»˜è®¤é¢œè‰²
        ///// </summary>
        ///// <value>进度区域背景默认颜色</value>
        //public uint WaveBgColor
        //{
        //    set
        //    {
        //        byte r, g, b, a;
        //        r = (byte)(value / 256 / 256 % 256);
        //        g = (byte)(value / 256 % 256);
        //        b = (byte)(value % 256);
        //        a = (byte)(value / 256 / 256 / 256 % 256);
        //        mHDLWaveSeekBar.SetWaveBgColor(Android.Graphics.Color.Argb(a, r, g, b));
        //    }
        //}
        /// <summary>
        /// è¿›åº¦æ¡ä¸Žè¾¹æ¡†è¾¹è·
        /// </summary>
        /// <value>半径</value>
        public int WavePadding
        {
            set
            {
                mHDLWaveSeekBar.SetWavePadding(value);
            }
        }
        //uint thumbColor = 0xFFFFFFFF;
        ///// <summary>
        ///// æ‹–动按钮圆形颜色
        ///// </summary>
        ///// <value>拖动按钮颜色</value>
        //public uint ThumbColor
        //{
        //    get
        //    {
        //        return thumbColor;
        //    }
        //    set
        //    {
        //        thumbColor = value;
        //        byte r, g, b, a;
        //        r = (byte)(thumbColor / 256 / 256 % 256);
        //        g = (byte)(thumbColor / 256 % 256);
        //        b = (byte)(thumbColor % 256);
        //        a = (byte)(thumbColor / 256 / 256 / 256 % 256);
        //        mHDLWaveSeekBar.SetThumbColor(Android.Graphics.Color.Argb(a, r, g, b));
        //    }
        //}
        /// <summary>
        /// EventHandler
        /// </summary>
        public EventHandler<int> OnProgressChangedEvent;
        public EventHandler<bool> OnStartTrackingTouchEvent;
        public EventHandler<int> OnStopTrackingTouchEvent;
        /// <summary>
        /// OnProgressChangeListener ç»§æ‰¿å“åº”事件
        /// </summary>
        OnProgressChangeListener mOnProgressChangeListener;
        public class OnProgressChangeListener : Java.Lang.Object, HDLWaveSeekBar.IOnProgressChangeListener
        {
            WaveSeekBar _WaveSeekBar;
            public OnProgressChangeListener(WaveSeekBar view)
            {
                _WaveSeekBar = view;
            }
            public void OnProgressChanged(HDLWaveSeekBar p0, int p1, bool p2)
            {
                _WaveSeekBar.OnProgressChangedEvent?.Invoke(this, p0.Progress);
            }
            public void OnStartTrackingTouch(HDLWaveSeekBar p0)
            {
                _WaveSeekBar.OnStartTrackingTouchEvent?.Invoke(this, true);
            }
            public void OnStopTrackingTouch(HDLWaveSeekBar p0)
            {
                //if (_WaveSeekBar.OnStopTrackingTouchEvent != null)
                //{
                //    _WaveSeekBar.OnStopTrackingTouchEvent(this, p0.Progress);
                //}
                _WaveSeekBar.OnStopTrackingTouchEvent?.Invoke(this, p0.Progress);
            }
        }
    }
}
ZigbeeApp/Shared.Droid/UI/WiimuUPnp.cs
New file
@@ -0,0 +1,125 @@
using System;
using Android.Net;
using Android.Net.Wifi;
using Android.OS;
namespace Shared
{
    public static class WiimuUPnP
    {
        /// <summary>
        /// èŽ·å–å½“å‰WIFI的名称
        /// </summary>
        /// <value>The ssid.</value>
        public static string SSID
        {
            get
            {
                return getWIFISSID(Shared.Application.Activity);
            }
        }
        /**
             * èŽ·å–SSID
             * @param activity ä¸Šä¸‹æ–‡
             * @return  WIFI çš„SSID
             */
        static string getWIFISSID(Android.App.Activity activity)
        {
            var ssid = "unknown id";
            if ((int)Build.VERSION.SdkInt <= 26/*8.0*/ || (int)Build.VERSION.SdkInt >= 28/*9.0*/)
            {
                var mWifiManager = (WifiManager)activity.ApplicationContext.GetSystemService(Android.Content.Context.WifiService);
                if (mWifiManager != null)
                {
                    var info = mWifiManager.ConnectionInfo;
                    if ((int)Build.VERSION.SdkInt < 19/*4.4*/)
                    {
                        return info.SSID;
                    }
                    else
                    {
                        return info.SSID.Replace("\"", "");
                    }
                }
            }
            //8.1
            else if ((int)Build.VERSION.SdkInt == 27)
            {
                var connManager = (ConnectivityManager)activity.ApplicationContext.GetSystemService(Android.Content.Context.ConnectivityService);
                if (connManager != null)
                {
                    var networkInfo = connManager.ActiveNetworkInfo;
                    if (networkInfo.IsConnected)
                    {
                        if (networkInfo.ExtraInfo != null)
                        {
                            return networkInfo.ExtraInfo.Replace("\"", "");
                        }
                    }
                }
            }
            return ssid;
        }
        static Action<string> currentAction;
        /// <summary>
        /// å¯åŠ¨é…ç½®æ— çº¿ä¸Šç½‘
        /// </summary>
        /// <returns>The start.</returns>
        /// <param name="password">密码</param>
        /// <param name="a">配置完成后反馈的结果</param>
        public static void Start(string password,Action<string> action)
        {
            if (SSID == null)
            {
                return;
            }
            Stop();
            dateTime = DateTime.Now;
            currentAction = action;
            action ("TimeOut");
        }
        static WiimuUPnP()
        {
            //定时检查
            System.Threading.Tasks.Task.Run(() =>
            {
                while (true)
                {
                    System.Threading.Thread.Sleep(1000);
                    if (20 <= (System.DateTime.Now - dateTime).TotalSeconds)
                    {
                        Stop();
                        if (currentAction != null)
                        {
                            currentAction("TimeOut");
                        }
                    }
                }
            });
        }
        /// <summary>
        /// è®°å½•开始时间
        /// </summary>
        static DateTime dateTime = DateTime.MaxValue;
        /// <summary>
        /// åœæ­¢é…ç½®æ— çº¿ä¸Šç½‘
        /// </summary>
        public static void Stop()
        {
            dateTime = DateTime.MaxValue;
        }
    }
}
ZigbeeApp/Shared.Droid/Utils/HDLUtils.cs
New file
@@ -0,0 +1,44 @@
using System;
using Android.Graphics;
using Com.Hdl.Widget;
namespace Shared
{
    public class HDLUtils
    {
        public static int RectCornerTopLeft = 1;
        public static int RectCornerTopRight = 2;
        public static int RectCornerBottomLeft = 4;
        public static int RectCornerBottomRight = 8;
        /// <summary>
        /// é‡å¯APP
        /// </summary>
        public static void RestartApp() {
          HDLUtlisXM.RelaunchApp(Application.Activity, true);
        }
        /// <summary>
        /// è®¾ç½®åŽŸç”ŸæŽ§ä»¶åº“ authorities的值
        /// </summary>
        public static void SetAuthoritiesName(string name)
        {
            HDLUtlisXM.MAuthorityNAME = name;
        }
        ///// <summary>
        ///// ç”ŸæˆäºŒç»´ç 
        ///// </summary>
        //public static Bitmap createQRCode(string url, int size = 500)
        //{
        //    return HDLUtlisXM.CreateQRCode(url, size);
        //}
    }
}
ZigbeeApp/Shared.Droid/Utils/TouchIDUtils.cs
New file
@@ -0,0 +1,205 @@
using System;
using Java.Lang;
//using Shared.Droid.TBL;
using Moe.Feng.Support.Biometricprompt;
using Android.OS;
using Android.Content;
//using Com.Bigkoo.Pickerview;
namespace Shared
{
    public class TouchIDUtils
    {
        public enum TouchIDSupperType
        {
            TouchID,
            FaceID,
            None
        }
        public enum TouchIDState
        {
            NotSupport,
            Success,
            Fail,
            InputPassword,
            TouchIDLockout
        }
        //BiometricPromptCompat mBiometricPrompt;
        //public TouchIDUtils()
        //{
        //    mOnIAuthenticationCallback = new OnIAuthenticationCallback(this);
        //    mBiometricPrompt = new BiometricPromptCompat.Builder(Application.Activity).SetTitle("验证").SetSubtitle("").SetDescription("").Build();
        //}
        public static TouchIDSupperType getTouchIDSupperType()
        {
            TouchIDSupperType type = TouchIDSupperType.None;
            bool bIsHardwareDetected = BiometricPromptCompat.IsHardwareDetected(Application.Activity);
            bool bHasEnrolledFingerprints = BiometricPromptCompat.HasEnrolledFingerprints(Application.Activity);
            if (bIsHardwareDetected && bHasEnrolledFingerprints)
            {
                type = TouchIDSupperType.TouchID;
            }
            else
            {
                type = TouchIDSupperType.None;
            }
            return type;
        }
        public EventHandler<TouchIDState> OnHDLTouchIDStateBackEvent;
        //StateBlock mStateBlock;
        /// <summary>
        /// å¼¹çª—指纹验证 descTitle:输入密码验证按钮标题   mLocalizedReason:Touch显示的描述
        /// </summary>
        /// <value>descTitle:输入密码验证按钮标题   mLocalizedReason:Touch显示的描述</value>
        public void showTouchIDWithDescribe(string descTitle, string mLocalizedReason)
        {
            if (descTitle == null)
            {
                descTitle = "输入密码验证";
            }
            if (mLocalizedReason == null)
            {
                mLocalizedReason = "通过已有指纹验证";
            }
            //BiometricPromptCompat biometricPrompt =
            //  new BiometricPromptCompat.Builder(Application.Activity).SetTitle("验证").SetSubtitle(mLocalizedReason).SetDescription("").SetNegativeButton(descTitle, new Android.Content.IDialogInterfaceOnClickListenerInvoker().Build();
            BiometricPromptCompat biometricPrompt =
            new BiometricPromptCompat.Builder(Application.Activity).SetTitle("验证").SetSubtitle(mLocalizedReason).SetDescription("").SetNegativeButton(descTitle, new MyIputPasswordClickListener(this)).Build();
            CancellationSignal cancellationSignal = new CancellationSignal();
            cancellationSignal.CancelEvent += (sender1, e1) => {
                System.Console.WriteLine("KK:点击了取消按钮");
            };
            //biometricPrompt.Authenticate(cancellationSignal, null);
            biometricPrompt.Authenticate(cancellationSignal, new OnIAuthenticationCallback(this));
        }
        class MyIputPasswordClickListener : Java.Lang.Object,Android.Content.IDialogInterfaceOnClickListener
        {
            TouchIDUtils _TouchIDUtils;
            public MyIputPasswordClickListener(TouchIDUtils obj)
            {
                _TouchIDUtils = obj;
            }
            public void OnClick(IDialogInterface dialog, int which)
            {
                _TouchIDUtils.OnHDLTouchIDStateBackEvent?.Invoke(this, TouchIDState.InputPassword);
            }
        }
        //①. OnAuthenticationError(int errorCode, ICharSequence errString) è¿™ä¸ªæŽ¥å£ä¼šå†ç³»ç»ŸæŒ‡çº¹è®¤è¯å‡ºçŽ°ä¸å¯æ¢å¤çš„é”™è¯¯çš„æ—¶å€™æ‰ä¼šè°ƒç”¨ï¼Œå¹¶ä¸”å‚æ•°errorCode就给出了错误码,标识了错误的原因。
        //      åœ¨AndroidP以前,这个方法回调回来之后,指纹识别sensor将会被关闭,也就是说,你再把手指放在指纹硬件上,将不会有反应了。这时候你需要提示用户关闭指纹识别弹窗,或改用密码支付等等
        //      ä»€ä¹ˆæƒ…况下会回调error错误呢?比如,连续识别错误5次指纹、指纹硬件不可用等等。
        //②. OnAuthenticationFailed()这个接口会在系统指纹认证失败的情况的下才会回调。注意这里的认证失败和上面的认证错误是不一样的,虽然结果都是不能认证。
        //      è®¤è¯å¤±è´¥æ˜¯æŒ‡æ‰€æœ‰çš„信息都采集完整,并且没有任何异常,但是这个指纹和之前注册的指纹是不相符的;但是认证错误是指在采集或者认证的过程中出现了错误,
        //      æ¯”如指纹传感器工作异常等。也就是说认证失败是一个可以预期的正常情况,而认证错误是不可预期的异常情况。
        //③.OnAuthenticationHelp(int helpMsgId, ICharSequence helpString)上面的认证失败是认证过程中的一个异常情况,我们说那种情况是因为出现了不可恢复的错误,
        //      è€Œæˆ‘们这里的OnAuthenticationHelp方法是出现了可以回复的异常才会调用的。什么是可以恢复的异常呢?一个常见的例子就是:手指移动太快,当我们把手指放到传感器上的时候,
        //      å¦‚果我们很快地将手指移走的话,那么指纹传感器可能只采集了部分的信息,因此认证会失败。但是这个错误是可以恢复的,因此只要提示用户再次按下指纹,并且不要太快移走就可以解决。
        //④. OnAuthenticationSucceeded(FingerprintManagerCompati.AuthenticationResult result)这个接口会在认证成功之后回调。我们可以在这个方法中提示用户认证成功。
        //      è¿™é‡Œéœ€è¦è¯´æ˜Žä¸€ä¸‹ï¼Œå¦‚果我们上面在调用authenticate的时候,我们的CryptoObject不是null的话,那么我们在这个方法中可以通过AuthenticationResult来获得Cypher对象然后调用它的doFinal方法。
        //      doFinal方法会检查结果是不是会拦截或者篡改过,如果是的话会抛出一个异常。当我们发现这些异常的时候都应该将认证当做是失败来来处理,为了安全建议大家都这么做。
        /// <summary>
        /// OnProgressChangeListener ç»§æ‰¿å“åº”事件
        /// </summary>
        OnIAuthenticationCallback mOnIAuthenticationCallback;
        //BiometricPromptCompat.IAuthenticationCallback
        public class OnIAuthenticationCallback : Java.Lang.Object,BiometricPromptCompat.IAuthenticationCallback
        {
            TouchIDUtils _TouchIDUtils;
            public OnIAuthenticationCallback(TouchIDUtils obj)
            {
                _TouchIDUtils = obj;
            }
            public void OnAuthenticationError(int mErrorId, ICharSequence mErrorStr)
            {
                //throw new NotImplementedException();
                if (mErrorId == 7)
                {
                    _TouchIDUtils.OnHDLTouchIDStateBackEvent?.Invoke(this, TouchIDState.NotSupport);
                    //System.Console.WriteLine("KK:Error:" + mErrorStr.ToString());
                }
                else {
                    System.Console.WriteLine("KK:Error" + mErrorStr.ToString() + "  CODE:" + mErrorId);
                }
            }
            public void OnAuthenticationFailed()
            {
                //throw new NotImplementedException();
                System.Console.WriteLine("KK:Failed无法识别,请再试一次");
            }
            public void OnAuthenticationHelp(int mErrorId, ICharSequence mErrorStr)
            {
                //throw new NotImplementedException();
                //System.Console.WriteLine("KK:Help无法识别,请再试一次");
                System.Console.WriteLine("KK:Error" + mErrorStr.ToString() + "  CODE:" + mErrorId);
            }
            public void OnAuthenticationSucceeded(BiometricPromptCompat.IAuthenticationResult p0)
            {
                _TouchIDUtils.OnHDLTouchIDStateBackEvent?.Invoke(this, TouchIDState.Success);
            }
        }
        // å•例
        static TouchIDUtils ourInstance = new TouchIDUtils();
        public static TouchIDUtils Instance
        {
            get
            {
                return ourInstance;
            }
        }
    }
}
Diff truncated after the above file
ZigbeeApp/Shared/.DS_Store ZigbeeApp/Shared/DLL/Android/Shared.Droid.dll ZigbeeApp/Shared/Phone/UserView/UserHomeView.cs