From ac334861efbf06933e95c62ced0484410f34bece Mon Sep 17 00:00:00 2001 From: gxc <guoxuecheng@guoxuechengdeMacBook-Pro.local> Date: 星期五, 29 十一月 2019 18:00:32 +0800 Subject: [PATCH] 2019.11.29 --- ZigbeeApp/Shared.Droid/Button.cs | 353 + ZigbeeApp/Shared/Phone/UserView/UserHomeView.cs | 28 ZigbeeApp/Shared.Droid/UI/Lanuage.cs | 90 ZigbeeApp/Shared.Droid/UI/ColorPicker.cs | 123 ZigbeeApp/Shared.Droid/UI/CurtainRollSeekBar.cs | 245 ZigbeeApp/Shared.Droid/UI/TextView.cs | 242 ZigbeeApp/Shared.Droid/Shared.Droid.csproj | 218 ZigbeeApp/GateWay.Droid/GateWay.Droid.csproj | 9 ZigbeeApp/Shared.Droid/Other/Volume.cs | 40 ZigbeeApp/Shared.Droid/UI/RowLayout.cs | 397 + ZigbeeApp/Shared.Droid/Transforms/EnumMethods.xml | 19 ZigbeeApp/Shared.Droid/UI/Contacts.cs | 27 ZigbeeApp/Shared.Droid/UI/DrawerLayout (副本).cs | 340 + ZigbeeApp/Shared.Droid/UI/WaveSeekBar.cs | 331 ZigbeeApp/Shared.Droid/UI/Alert.cs | 97 ZigbeeApp/Shared.Droid/Net/NetWiFi.cs | 188 ZigbeeApp/Shared.Droid/UI/CurtainSeekBar.cs | 249 ZigbeeApp/Shared.Droid/Utils/TouchIDUtils.cs | 205 ZigbeeApp/.vs/GateWay/xs/sqlite3/storage.ide | 0 ZigbeeApp/Shared.Droid/Other/Server.cs | 74 ZigbeeApp/Shared.Droid/Transforms/Metadata.xml | 13 ZigbeeApp/Shared.Droid/UI/Loading.cs | 196 ZigbeeApp/GateWay.Droid/Assets/Phone/Room/Humidity.png | 0 ZigbeeApp/Shared.Droid/UI/ArcSeekBar.cs | 357 + ZigbeeApp/Shared.Droid/UI/VerticalRefreshLayout.cs | 360 + ZigbeeApp/Shared.Droid/UI/DateView.cs | 74 ZigbeeApp/Shared.Droid/UI/SwipeLayout.cs | 323 ZigbeeApp/Shared.Droid/Utils/HDLUtils.cs | 44 ZigbeeApp/.vs/GateWay/xs/project-cache/Shared.Droid-Debug.json | 2 ZigbeeApp/Shared.Droid/UI/PageLayout.cs | 801 ++ ZigbeeApp/.vs/GateWay/xs/UserPrefs.xml | 45 ZigbeeApp/Shared.Droid/UI/Application.cs | 229 ZigbeeApp/Shared.Droid/UI/View.cs | 1277 +++ ZigbeeApp/Shared.Droid/UI/UICoverFlowView.cs | 326 ZigbeeApp/Shared.Droid/UI/EditTextView.cs | 546 + ZigbeeApp/Shared.Droid/UI/GestureLockView.cs | 152 ZigbeeApp/Shared.Droid/UI/UIPickerView.cs | 186 ZigbeeApp/Shared.Droid/Jars/MyJar.jar | 0 ZigbeeApp/Shared.Droid/UI/Video.cs | 217 ZigbeeApp/Shared.Droid/Other/MusicInfo.cs | 133 ZigbeeApp/Shared.Droid/Transforms/EnumFields.xml | 19 ZigbeeApp/Shared.Droid/UI/ImageView.cs | 344 + ZigbeeApp/Shared.Droid/Encryption/BigInteger.cs | 3137 +++++++++ ZigbeeApp/Shared.Droid/Encryption/RSA.cs | 42 ZigbeeApp/GateWay.Droid/Assets/Phone/Room/Temperature.png | 0 ZigbeeApp/Shared.Droid/UI/Dialog.cs | 156 ZigbeeApp/Shared.Droid/UI/FrameLayout.cs | 90 ZigbeeApp/Shared.Droid/UI/HorizontalSeekBar.cs | 354 + ZigbeeApp/Shared.Droid/UI/UIDrawerLayout.cs | 328 ZigbeeApp/Shared.Droid/UI/VerticalScrolViewLayout.cs | 42 ZigbeeApp/Shared.Droid/MyBroadcastReceive.cs | 100 ZigbeeApp/Shared.Droid/UI/ArcScaleSeekBar.cs | 250 ZigbeeApp/Shared.Droid/CommonClass.cs | 106 ZigbeeApp/Shared.Droid/UI/EditText.cs | 548 + ZigbeeApp/Shared.Droid/UI/UrlMonitor.cs | 94 ZigbeeApp/Shared/DLL/Android/Shared.Droid.dll | 0 ZigbeeApp/Shared.Droid/UI/Button.cs | 378 + ZigbeeApp/Shared.Droid/UI/HorizontalPages.cs | 530 + ZigbeeApp/Shared.Droid/Shared.Droid.sln | 17 ZigbeeApp/Shared.Droid/UI/TimeView.cs | 140 ZigbeeApp/Shared.Droid/Net/WifiUtil.cs | 107 ZigbeeApp/Shared.Droid/Properties/AssemblyInfo.cs | 28 ZigbeeApp/GateWay.Droid/Assets/Phone/Room/List.png | 0 ZigbeeApp/Shared.Droid/Additions/AboutAdditions.txt | 48 ZigbeeApp/Shared.Droid/Jars/EzvizGlobalAPI.jar | 0 ZigbeeApp/Shared.Droid/UI/MusicVerticalScrolViewLayout.cs | 418 + ZigbeeApp/Shared.Droid/BaseActivity.cs | 871 ++ ZigbeeApp/Shared.Droid/Jars/libammsdk.jar | 0 ZigbeeApp/Shared.Droid/Encryption/BASE64.cs | 53 ZigbeeApp/Shared.Droid/Encryption/DES.cs | 75 ZigbeeApp/Shared.Droid/UI/Enum.cs | 78 ZigbeeApp/Shared.Droid/UI/VerticalSeekBar.cs | 414 + ZigbeeApp/Shared.Droid/Jars/AboutJars.txt | 37 ZigbeeApp/Shared.Droid/UI/GDMapView.cs | 56 ZigbeeApp/Shared.Droid/UI/WiimuUPnp.cs | 125 ZigbeeApp/Shared.Droid/SplashActivity.cs | 34 ZigbeeApp/Shared.Droid/Other/MusicService.cs | 111 ZigbeeApp/Shared.Droid/UI/Camera.cs | 228 ZigbeeApp/.vs/GateWay/xs/project-cache/GateWay.Droid-Debug.json | 2 ZigbeeApp/Shared.Droid/UI/CropImage.cs | 126 ZigbeeApp/Shared.Droid/UI/ViewGroup.cs | 270 ZigbeeApp/Shared.Droid/UI/HorizontalScrolViewLayout.cs | 214 ZigbeeApp/Shared.Droid/UI/Tip.cs | 61 ZigbeeApp/Shared.Droid/Other/ServerHandler.cs | 273 ZigbeeApp/Shared.Droid/MyService.cs | 199 ZigbeeApp/Shared.Droid/Jars/HDLArcSeekbar-release.aar | 0 ZigbeeApp/Shared.Droid/Other/DensityUtil.cs | 30 ZigbeeApp/Shared.Droid/UI/MyEchartsView.cs | 182 ZigbeeApp/Shared.Droid/UI/PickerView.cs | 241 ZigbeeApp/Shared.Droid/IO/FileUtils.cs | 261 ZigbeeApp/Shared.Droid/UI/Spinner.cs | 178 ZigbeeApp/Shared.Droid/UI/QRCode.cs | 61 ZigbeeApp/Shared/.DS_Store | 0 93 files changed, 19,968 insertions(+), 44 deletions(-) diff --git a/ZigbeeApp/.vs/GateWay/xs/UserPrefs.xml b/ZigbeeApp/.vs/GateWay/xs/UserPrefs.xml index 3e4f4db..cfd0e9b 100644 --- a/ZigbeeApp/.vs/GateWay/xs/UserPrefs.xml +++ b/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> \ No newline at end of file diff --git a/ZigbeeApp/.vs/GateWay/xs/project-cache/GateWay.Droid-Debug.json b/ZigbeeApp/.vs/GateWay/xs/project-cache/GateWay.Droid-Debug.json index d2a656f..81383d3 100644 --- a/ZigbeeApp/.vs/GateWay/xs/project-cache/GateWay.Droid-Debug.json +++ b/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":[]} \ No newline at end of file +{"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":[]} \ No newline at end of file diff --git a/ZigbeeApp/.vs/GateWay/xs/project-cache/Shared.Droid-Debug.json b/ZigbeeApp/.vs/GateWay/xs/project-cache/Shared.Droid-Debug.json index aef06dc..596d92d 100644 --- a/ZigbeeApp/.vs/GateWay/xs/project-cache/Shared.Droid-Debug.json +++ b/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":[]} \ No newline at end of file +{"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":[]} \ No newline at end of file diff --git a/ZigbeeApp/.vs/GateWay/xs/sqlite3/storage.ide b/ZigbeeApp/.vs/GateWay/xs/sqlite3/storage.ide index 3a4aac0..6985805 100644 --- a/ZigbeeApp/.vs/GateWay/xs/sqlite3/storage.ide +++ b/ZigbeeApp/.vs/GateWay/xs/sqlite3/storage.ide Binary files differ diff --git a/ZigbeeApp/GateWay.Droid/Assets/Phone/Room/Humidity.png b/ZigbeeApp/GateWay.Droid/Assets/Phone/Room/Humidity.png new file mode 100755 index 0000000..4986073 --- /dev/null +++ b/ZigbeeApp/GateWay.Droid/Assets/Phone/Room/Humidity.png Binary files differ diff --git a/ZigbeeApp/GateWay.Droid/Assets/Phone/Room/List.png b/ZigbeeApp/GateWay.Droid/Assets/Phone/Room/List.png new file mode 100755 index 0000000..b63955c --- /dev/null +++ b/ZigbeeApp/GateWay.Droid/Assets/Phone/Room/List.png Binary files differ diff --git a/ZigbeeApp/GateWay.Droid/Assets/Phone/Room/Temperature.png b/ZigbeeApp/GateWay.Droid/Assets/Phone/Room/Temperature.png new file mode 100755 index 0000000..fc66b4f --- /dev/null +++ b/ZigbeeApp/GateWay.Droid/Assets/Phone/Room/Temperature.png Binary files differ diff --git a/ZigbeeApp/GateWay.Droid/GateWay.Droid.csproj b/ZigbeeApp/GateWay.Droid/GateWay.Droid.csproj index 9e4d07a..002a34b 100644 --- a/ZigbeeApp/GateWay.Droid/GateWay.Droid.csproj +++ b/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" /> diff --git a/ZigbeeApp/Shared.Droid/Additions/AboutAdditions.txt b/ZigbeeApp/Shared.Droid/Additions/AboutAdditions.txt new file mode 100755 index 0000000..c511f1d --- /dev/null +++ b/ZigbeeApp/Shared.Droid/Additions/AboutAdditions.txt @@ -0,0 +1,48 @@ +锘緼dditions 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; } +} diff --git a/ZigbeeApp/Shared.Droid/BaseActivity.cs b/ZigbeeApp/Shared.Droid/BaseActivity.cs new file mode 100644 index 0000000..29a5d7c --- /dev/null +++ b/ZigbeeApp/Shared.Droid/BaseActivity.cs @@ -0,0 +1,871 @@ +锘縰sing 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); + // } + // } + + + //} + //鏂扮殑娣诲姞锛屽彲浠ヨВ鍐冲垏鎹㈣瑷�鍚庣櫥闄嗛棶棰樸�侰onfigurationChanges= 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; //瀹藉害锛圥X锛� + //鑰冭檻鍒�5.7瀵稿睆寰�涓婂亸绉伙紝鍔犻珮鐖舵帶浠剁殑楂樺害 + Shared.Application.CurrentHeight = metric.HeightPixels - TopMargin; //楂樺害锛圥X + + //鐖舵帶浠� + 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;//鏍规嵁璇锋眰鐨凜ode鏉ョ‘璁よ姹傜殑鏉冮檺 + 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); + } + } + //涔嬪墠鐨勫啓娉曪紝鍚庨潰鍙互閫氳繃涓婇潰鐨勬柟寮忓鐞嗭紝鐒跺悗鍘绘帀杩欏潡浠g爜 + 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; + // 鍒涘缓鍐呭瑙f瀽鑰� + 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> + ///// 瑙e帇鏂囦欢鍒版寚瀹氭枃浠跺す + ///// </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 ($"鏂囦欢瑙e帇鍙戠敓閿欒:{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); + + /**鑾峰緱褰撳墠杩愯鐨則ask(浠诲姟)*/ + 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; + } + } +} + diff --git a/ZigbeeApp/Shared.Droid/Button.cs b/ZigbeeApp/Shared.Droid/Button.cs new file mode 100644 index 0000000..43bf16e --- /dev/null +++ b/ZigbeeApp/Shared.Droid/Button.cs @@ -0,0 +1,353 @@ +锘縰sing 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)); + } + } + } + } + + } +} + + diff --git a/ZigbeeApp/Shared.Droid/CommonClass.cs b/ZigbeeApp/Shared.Droid/CommonClass.cs new file mode 100755 index 0000000..9ccc0f1 --- /dev/null +++ b/ZigbeeApp/Shared.Droid/CommonClass.cs @@ -0,0 +1,106 @@ +锘縰sing 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锛屼篃鍙互涓嶉渶瑕侊紝杩欐牱灏辨槸鍦ㄥ綋鍓岮PP鍐呮墦寮�锛堝悓涓�涓繘绋嬶級 + 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涓槸鍚︽湁鐩爣绋嬪簭鐨勫寘鍚嶏紝鏈塗RUE锛屾病鏈塅ALSE + 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銆佹垜浠珹pp鍏堣幏鍙朤oken鍙婃椂闂� +//2銆佺劧鍚庣敤Tidal甯愬彿鐩存帴鐧诲綍airable鏈嶅姟鍣� +//3銆佽幏鍙栨挱鏀惧垪琛紙涓嶆槸鐪熷疄鐨勬挱鏀惧湴鍧�锛� +//4銆佹牴鎹挱鏀惧垪琛ㄥ幓鑾峰彇鐪熷疄鐨勬挱鏀惧湴鍧�锛堣繖閲岃幏鍙栨椂闂村緢闀匡紝姣忎竴棣栨椂闂撮暱鐨勬湁浜斿叚绉掗兘鏈夊彲鑳斤級 +//5銆佹帹閫佸埌鎾斁鍣� + + +//绗簩绉嶏細浣撻獙鏁堟灉寰堝ソ锛屼絾鍙戦�佸埌鎾斁鐨勫瘑鐮佹槸鍔犲瘑鐨勶紝闇�瑕佺畻娉曘�傚疄鐜版�濊矾濡備笅锛� +//1銆佹垜浠珹pp鍏堣幏鍙朤oken鍙婃椂闂� +//2銆佺劧鍚庣敤Tidal甯愬彿鐩存帴鐧诲綍airable鏈嶅姟鍣ㄥ苟鍚屾椂鎶婄敤鎴峰悕鍜屽瘑鐮佸憡璇夋挱鏀惧櫒 +//3銆佽幏鍙栨挱鏀惧垪琛紙涓嶆槸鐪熷疄鐨勬挱鏀惧湴鍧�锛屽叧閿俊鎭槸ID锛� +//4銆佹帹閫佸埌鎾斁鍒楄〃鍒版挱鏀惧櫒 + diff --git a/ZigbeeApp/Shared.Droid/Encryption/BASE64.cs b/ZigbeeApp/Shared.Droid/Encryption/BASE64.cs new file mode 100755 index 0000000..2e38691 --- /dev/null +++ b/ZigbeeApp/Shared.Droid/Encryption/BASE64.cs @@ -0,0 +1,53 @@ +锘縰sing 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绠楁硶瑙e瘑 + /// </summary> + /// <param name="code">宸茬敤base64绠楁硶鍔犲瘑鐨勫瓧绗︿覆</param> + /// <returns>瑙e瘑鍚庣殑瀛楃涓�</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; + } + } + + +} + + diff --git a/ZigbeeApp/Shared.Droid/Encryption/BigInteger.cs b/ZigbeeApp/Shared.Droid/Encryption/BigInteger.cs new file mode 100755 index 0000000..f4ffd0b --- /dev/null +++ b/ZigbeeApp/Shared.Droid/Encryption/BigInteger.cs @@ -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>."); + } + } + + + + + + } +} + + diff --git a/ZigbeeApp/Shared.Droid/Encryption/DES.cs b/ZigbeeApp/Shared.Droid/Encryption/DES.cs new file mode 100755 index 0000000..0ede921 --- /dev/null +++ b/ZigbeeApp/Shared.Droid/Encryption/DES.cs @@ -0,0 +1,75 @@ +锘縰sing System; +using System.Text; +using System.Security.Cryptography; +using System.IO; + +namespace Shared.Encryption +{ + public class DES + { + //<summary><![CDATA[瀛楃涓睤ES鍔犲瘑鍑芥暟]]></summary> +聽聽聽聽聽聽聽 //<param name="str"><![CDATA[琚姞瀵嗗瓧绗︿覆 ]]></param> +聽聽聽聽聽聽聽 //<param name="key"><![CDATA[瀵嗛挜 ]]></param>聽 +聽聽聽聽聽聽聽 //<returns><![CDATA[鍔犲瘑鍚庡瓧绗︿覆锛宔rror寮�澶磋〃绀洪敊璇痌]></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[瀛楃涓睤ES瑙e瘑鍑芥暟]]></summary> +聽聽聽聽聽聽聽 //<param name="str"><![CDATA[琚В瀵嗗瓧绗︿覆 ]]></param> +聽聽聽聽聽聽聽 //<param name="key"><![CDATA[瀵嗛挜 ]]></param>聽 +聽聽聽聽聽聽聽 //<returns><![CDATA[瑙e瘑鍚庡瓧绗︿覆,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:瑙e瘑澶辫触!"; + } + } + } +} diff --git a/ZigbeeApp/Shared.Droid/Encryption/RSA.cs b/ZigbeeApp/Shared.Droid/Encryption/RSA.cs new file mode 100755 index 0000000..67319ca --- /dev/null +++ b/ZigbeeApp/Shared.Droid/Encryption/RSA.cs @@ -0,0 +1,42 @@ +锘縰sing System; +namespace Shared.Encryption +{ + public class RSA + { + /// <summary> + /// 鐢ㄦ寚瀹氱殑瀵嗗寵鍔犲瘑 + /// </summary> + /// <param name="source">鏄庢枃</param> + /// <param name="e">鍙互鏄疪SACryptoServiceProvider鐢熸垚鐨凟</param> + /// <param name="n">鍙互鏄疪SACryptoServiceProvider鐢熸垚鐨凪odulus</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('@'); + } + + } +} diff --git a/ZigbeeApp/Shared.Droid/IO/FileUtils.cs b/ZigbeeApp/Shared.Droid/IO/FileUtils.cs new file mode 100644 index 0000000..cf32596 --- /dev/null +++ b/ZigbeeApp/Shared.Droid/IO/FileUtils.cs @@ -0,0 +1,261 @@ +锘縰sing 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(); + } + + } + } + } +} + diff --git a/ZigbeeApp/Shared.Droid/Jars/AboutJars.txt b/ZigbeeApp/Shared.Droid/Jars/AboutJars.txt new file mode 100755 index 0000000..320a154 --- /dev/null +++ b/ZigbeeApp/Shared.Droid/Jars/AboutJars.txt @@ -0,0 +1,37 @@ +锘縏his 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. + + diff --git a/ZigbeeApp/Shared.Droid/Jars/EzvizGlobalAPI.jar b/ZigbeeApp/Shared.Droid/Jars/EzvizGlobalAPI.jar new file mode 100755 index 0000000..f32e6e7 --- /dev/null +++ b/ZigbeeApp/Shared.Droid/Jars/EzvizGlobalAPI.jar Binary files differ diff --git a/ZigbeeApp/Shared.Droid/Jars/HDLArcSeekbar-release.aar b/ZigbeeApp/Shared.Droid/Jars/HDLArcSeekbar-release.aar new file mode 100755 index 0000000..0ac9cd8 --- /dev/null +++ b/ZigbeeApp/Shared.Droid/Jars/HDLArcSeekbar-release.aar Binary files differ diff --git a/ZigbeeApp/Shared.Droid/Jars/MyJar.jar b/ZigbeeApp/Shared.Droid/Jars/MyJar.jar new file mode 100755 index 0000000..d36e9d9 --- /dev/null +++ b/ZigbeeApp/Shared.Droid/Jars/MyJar.jar Binary files differ diff --git a/ZigbeeApp/Shared.Droid/Jars/libammsdk.jar b/ZigbeeApp/Shared.Droid/Jars/libammsdk.jar new file mode 100755 index 0000000..d17e37f --- /dev/null +++ b/ZigbeeApp/Shared.Droid/Jars/libammsdk.jar Binary files differ diff --git a/ZigbeeApp/Shared.Droid/MyBroadcastReceive.cs b/ZigbeeApp/Shared.Droid/MyBroadcastReceive.cs new file mode 100644 index 0000000..2c40df4 --- /dev/null +++ b/ZigbeeApp/Shared.Droid/MyBroadcastReceive.cs @@ -0,0 +1,100 @@ +锘縰sing 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; + } + + } +} \ No newline at end of file diff --git a/ZigbeeApp/Shared.Droid/MyService.cs b/ZigbeeApp/Shared.Droid/MyService.cs new file mode 100644 index 0000000..857c359 --- /dev/null +++ b/ZigbeeApp/Shared.Droid/MyService.cs @@ -0,0 +1,199 @@ +锘縰sing 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鏄惁姝e父鍚姩 + 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; + } + } +} diff --git a/ZigbeeApp/Shared.Droid/Net/NetWiFi.cs b/ZigbeeApp/Shared.Droid/Net/NetWiFi.cs new file mode 100644 index 0000000..c473897 --- /dev/null +++ b/ZigbeeApp/Shared.Droid/Net/NetWiFi.cs @@ -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; + } + } + + +} \ No newline at end of file diff --git a/ZigbeeApp/Shared.Droid/Net/WifiUtil.cs b/ZigbeeApp/Shared.Droid/Net/WifiUtil.cs new file mode 100755 index 0000000..f523152 --- /dev/null +++ b/ZigbeeApp/Shared.Droid/Net/WifiUtil.cs @@ -0,0 +1,107 @@ +锘縰sing System; +using Android.Content; +using Android.Net.Wifi; + +namespace Shared.Net +{ + public class WifiUtil + { + /* + * 鍒囨崲鍒版寚瀹歸ifi + * @param wifiName 鎸囧畾鐨剋ifi鍚嶅瓧 + * @param wifiPwd wifi瀵嗙爜锛屽鏋滃凡缁忎繚瀛樿繃瀵嗙爜锛屽彲浠ヤ紶鍏ull + * @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銆佸鏋渨ifi杩樻病鏈夎緭鍏ヨ繃瀵嗙爜锛屽皾璇曡緭鍏ュ瘑鐮侊紝鍚姩wifi + if (!bFindInList) { + var wifiNewConfiguration = createWifiInfo (wifiName, wifiPwd);//浣跨敤wpa2鐨剋ifi鍔犲瘑鏂瑰紡 + int newNetworkId = mWifiManager.AddNetwork (wifiNewConfiguration); + if (newNetworkId == -1) { + //Log.e (TAG, "鎿嶄綔澶辫触,闇�瑕佹偍鍒版墜鏈簑ifi鍒楄〃涓彇娑堝璁惧杩炴帴鐨勪繚瀛�"); + } else { + result = doChange2Wifi (newNetworkId); + } + } + } catch { } finally { + if (action != null) + action (result); + } + } + + bool doChange2Wifi (int newNetworkId) + { + var enableNetwork = mWifiManager.EnableNetwork (newNetworkId, true); + if (!enableNetwork) { + //"鍒囨崲鍒版寚瀹歸ifi澶辫触"; + return false; + } else { + // "鍒囨崲鍒版寚瀹歸ifi鎴愬姛"; + return true; + } + } + + /* + * 鍒涘缓 WifiConfiguration锛岃繖閲屽垱寤虹殑鏄痺pa2鍔犲瘑鏂瑰紡鐨剋ifi + * @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; + } + } + } +} diff --git a/ZigbeeApp/Shared.Droid/Other/DensityUtil.cs b/ZigbeeApp/Shared.Droid/Other/DensityUtil.cs new file mode 100755 index 0000000..7312c62 --- /dev/null +++ b/ZigbeeApp/Shared.Droid/Other/DensityUtil.cs @@ -0,0 +1,30 @@ +锘縰sing 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); + } + } +} + diff --git a/ZigbeeApp/Shared.Droid/Other/MusicInfo.cs b/ZigbeeApp/Shared.Droid/Other/MusicInfo.cs new file mode 100755 index 0000000..c1efdbd --- /dev/null +++ b/ZigbeeApp/Shared.Droid/Other/MusicInfo.cs @@ -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; + } +} \ No newline at end of file diff --git a/ZigbeeApp/Shared.Droid/Other/MusicService.cs b/ZigbeeApp/Shared.Droid/Other/MusicService.cs new file mode 100755 index 0000000..2ae1294 --- /dev/null +++ b/ZigbeeApp/Shared.Droid/Other/MusicService.cs @@ -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> + /// 鏄惁姝e湪杩愯 + /// </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> + /// 鍒濆鍖朩ebServer鐨勮矾寰� + /// </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 { } + } + } +} \ No newline at end of file diff --git a/ZigbeeApp/Shared.Droid/Other/Server.cs b/ZigbeeApp/Shared.Droid/Other/Server.cs new file mode 100755 index 0000000..1f4ff76 --- /dev/null +++ b/ZigbeeApp/Shared.Droid/Other/Server.cs @@ -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); + } + } +} \ No newline at end of file diff --git a/ZigbeeApp/Shared.Droid/Other/ServerHandler.cs b/ZigbeeApp/Shared.Droid/Other/ServerHandler.cs new file mode 100755 index 0000000..8fd4fd5 --- /dev/null +++ b/ZigbeeApp/Shared.Droid/Other/ServerHandler.cs @@ -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"; + } + } +} \ No newline at end of file diff --git a/ZigbeeApp/Shared.Droid/Other/Volume.cs b/ZigbeeApp/Shared.Droid/Other/Volume.cs new file mode 100755 index 0000000..c7ded75 --- /dev/null +++ b/ZigbeeApp/Shared.Droid/Other/Volume.cs @@ -0,0 +1,40 @@ +锘縰sing 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; + } + } +} diff --git a/ZigbeeApp/Shared.Droid/Properties/AssemblyInfo.cs b/ZigbeeApp/Shared.Droid/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..ae1abba --- /dev/null +++ b/ZigbeeApp/Shared.Droid/Properties/AssemblyInfo.cs @@ -0,0 +1,28 @@ +锘縰sing 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("")] + diff --git a/ZigbeeApp/Shared.Droid/Shared.Droid.csproj b/ZigbeeApp/Shared.Droid/Shared.Droid.csproj new file mode 100644 index 0000000..69a02d4 --- /dev/null +++ b/ZigbeeApp/Shared.Droid/Shared.Droid.csproj @@ -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> \ No newline at end of file diff --git a/ZigbeeApp/Shared.Droid/Shared.Droid.sln b/ZigbeeApp/Shared.Droid/Shared.Droid.sln new file mode 100755 index 0000000..34f8062 --- /dev/null +++ b/ZigbeeApp/Shared.Droid/Shared.Droid.sln @@ -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 diff --git a/ZigbeeApp/Shared.Droid/SplashActivity.cs b/ZigbeeApp/Shared.Droid/SplashActivity.cs new file mode 100755 index 0000000..f74ad6f --- /dev/null +++ b/ZigbeeApp/Shared.Droid/SplashActivity.cs @@ -0,0 +1,34 @@ +锘縰sing 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); + + } + + } +} diff --git a/ZigbeeApp/Shared.Droid/Transforms/EnumFields.xml b/ZigbeeApp/Shared.Droid/Transforms/EnumFields.xml new file mode 100755 index 0000000..68cc7fd --- /dev/null +++ b/ZigbeeApp/Shared.Droid/Transforms/EnumFields.xml @@ -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> diff --git a/ZigbeeApp/Shared.Droid/Transforms/EnumMethods.xml b/ZigbeeApp/Shared.Droid/Transforms/EnumMethods.xml new file mode 100755 index 0000000..bd77573 --- /dev/null +++ b/ZigbeeApp/Shared.Droid/Transforms/EnumMethods.xml @@ -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> diff --git a/ZigbeeApp/Shared.Droid/Transforms/Metadata.xml b/ZigbeeApp/Shared.Droid/Transforms/Metadata.xml new file mode 100755 index 0000000..6a9cc80 --- /dev/null +++ b/ZigbeeApp/Shared.Droid/Transforms/Metadata.xml @@ -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> diff --git a/ZigbeeApp/Shared.Droid/UI/Alert.cs b/ZigbeeApp/Shared.Droid/UI/Alert.cs new file mode 100644 index 0000000..7bf1e28 --- /dev/null +++ b/ZigbeeApp/Shared.Droid/UI/Alert.cs @@ -0,0 +1,97 @@ +锘縰sing 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">鍙栨秷鎸夐敭澶囨敞锛屽�糿ull琛ㄧず涓嶆樉绀哄彇娑堟寜閿�</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> + /// 缁撴灉閫氱煡浜嬩欢锛宼rue琛ㄧず閫変腑鎸夐敭锛宖alse琛ㄧず鍙栨秷浜嬩欢 + /// </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(); + } + + } + + + + } +} + diff --git a/ZigbeeApp/Shared.Droid/UI/Application.cs b/ZigbeeApp/Shared.Droid/UI/Application.cs new file mode 100644 index 0000000..f225058 --- /dev/null +++ b/ZigbeeApp/Shared.Droid/UI/Application.cs @@ -0,0 +1,229 @@ +锘縰sing 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> + /// 褰撳墠鐨凙ctivity + /// </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> + /// 鏄惁鏄痯ad + /// </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> + /// 鐨偆锛宯ull鏃惰〃绀虹敤榛樿鐨� + /// </summary> + public static string Skin; + /// <summary> + /// GPS浣嶇疆鍙樺寲浜嬩欢 + /// </summary> + public static Action<double, double> LocationAction; + } +} \ No newline at end of file diff --git a/ZigbeeApp/Shared.Droid/UI/ArcScaleSeekBar.cs b/ZigbeeApp/Shared.Droid/UI/ArcScaleSeekBar.cs new file mode 100644 index 0000000..c5125fc --- /dev/null +++ b/ZigbeeApp/Shared.Droid/UI/ArcScaleSeekBar.cs @@ -0,0 +1,250 @@ +锘縰sing 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); + + } + } + } +} diff --git a/ZigbeeApp/Shared.Droid/UI/ArcSeekBar.cs b/ZigbeeApp/Shared.Droid/UI/ArcSeekBar.cs new file mode 100644 index 0000000..a4c1ee2 --- /dev/null +++ b/ZigbeeApp/Shared.Droid/UI/ArcSeekBar.cs @@ -0,0 +1,357 @@ +锘縰sing 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); + + } + } + } +} diff --git a/ZigbeeApp/Shared.Droid/UI/Button.cs b/ZigbeeApp/Shared.Droid/UI/Button.cs new file mode 100644 index 0000000..442c6ae --- /dev/null +++ b/ZigbeeApp/Shared.Droid/UI/Button.cs @@ -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 +{ + + + //宸茬粡鍏ㄩ潰妫�鏌ヤ簡浠g爜 + /// <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; } + } + } +} \ No newline at end of file diff --git a/ZigbeeApp/Shared.Droid/UI/Camera.cs b/ZigbeeApp/Shared.Droid/UI/Camera.cs new file mode 100644 index 0000000..2d6e954 --- /dev/null +++ b/ZigbeeApp/Shared.Droid/UI/Camera.cs @@ -0,0 +1,228 @@ +锘縰sing 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); + } + }); + } + } +} + diff --git a/ZigbeeApp/Shared.Droid/UI/ColorPicker.cs b/ZigbeeApp/Shared.Droid/UI/ColorPicker.cs new file mode 100644 index 0000000..d8a51d2 --- /dev/null +++ b/ZigbeeApp/Shared.Droid/UI/ColorPicker.cs @@ -0,0 +1,123 @@ +锘縰sing 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 + } + } + } +} diff --git a/ZigbeeApp/Shared.Droid/UI/Contacts.cs b/ZigbeeApp/Shared.Droid/UI/Contacts.cs new file mode 100644 index 0000000..d4b2c18 --- /dev/null +++ b/ZigbeeApp/Shared.Droid/UI/Contacts.cs @@ -0,0 +1,27 @@ +锘縰sing 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); + } + }); + } + } +} diff --git a/ZigbeeApp/Shared.Droid/UI/CropImage.cs b/ZigbeeApp/Shared.Droid/UI/CropImage.cs new file mode 100644 index 0000000..19b62cf --- /dev/null +++ b/ZigbeeApp/Shared.Droid/UI/CropImage.cs @@ -0,0 +1,126 @@ +锘縰sing 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); + } + } + + + + } +} + diff --git a/ZigbeeApp/Shared.Droid/UI/CurtainRollSeekBar.cs b/ZigbeeApp/Shared.Droid/UI/CurtainRollSeekBar.cs new file mode 100644 index 0000000..59e284f --- /dev/null +++ b/ZigbeeApp/Shared.Droid/UI/CurtainRollSeekBar.cs @@ -0,0 +1,245 @@ +锘縰sing 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); + + } + } + } +} diff --git a/ZigbeeApp/Shared.Droid/UI/CurtainSeekBar.cs b/ZigbeeApp/Shared.Droid/UI/CurtainSeekBar.cs new file mode 100644 index 0000000..1cfc43d --- /dev/null +++ b/ZigbeeApp/Shared.Droid/UI/CurtainSeekBar.cs @@ -0,0 +1,249 @@ +锘縰sing 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); + + } + } + } +} diff --git a/ZigbeeApp/Shared.Droid/UI/DateView.cs b/ZigbeeApp/Shared.Droid/UI/DateView.cs new file mode 100755 index 0000000..261a832 --- /dev/null +++ b/ZigbeeApp/Shared.Droid/UI/DateView.cs @@ -0,0 +1,74 @@ +锘縰sing 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) + { } + } + } +} diff --git a/ZigbeeApp/Shared.Droid/UI/Dialog.cs b/ZigbeeApp/Shared.Droid/UI/Dialog.cs new file mode 100755 index 0000000..94261b5 --- /dev/null +++ b/ZigbeeApp/Shared.Droid/UI/Dialog.cs @@ -0,0 +1,156 @@ +锘縰sing 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 (); + //} + + } +} \ No newline at end of file diff --git "a/ZigbeeApp/Shared.Droid/UI/DrawerLayout \050\345\211\257\346\234\254\051.cs" "b/ZigbeeApp/Shared.Droid/UI/DrawerLayout \050\345\211\257\346\234\254\051.cs" new file mode 100644 index 0000000..e04ba5d --- /dev/null +++ "b/ZigbeeApp/Shared.Droid/UI/DrawerLayout \050\345\211\257\346\234\254\051.cs" @@ -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 +//{ +// //宸茬粡鍏ㄩ潰妫�鏌ヤ簡浠g爜 +// /// <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: +// //璁板綍鐐瑰嚮鐨勬渶鏂癤鍧愭爣 +// 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鍜孫nTouchEvent +// /// </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); +// } +// } +// } +//} + + + diff --git a/ZigbeeApp/Shared.Droid/UI/EditText.cs b/ZigbeeApp/Shared.Droid/UI/EditText.cs new file mode 100644 index 0000000..0121cdb --- /dev/null +++ b/ZigbeeApp/Shared.Droid/UI/EditText.cs @@ -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; + } + } + //澶у鏂板勾濂斤紒缂栬瘧浜虹敓浠g爜锛岃繍琛屽垢绂忕▼搴忥紱鍗囩骇搴旂敤鍔熻兘锛岃秴鍑洪」鐩渶姹傘��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; + } +} + + diff --git a/ZigbeeApp/Shared.Droid/UI/EditTextView.cs b/ZigbeeApp/Shared.Droid/UI/EditTextView.cs new file mode 100644 index 0000000..664614e --- /dev/null +++ b/ZigbeeApp/Shared.Droid/UI/EditTextView.cs @@ -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; + } + } + //澶у鏂板勾濂斤紒缂栬瘧浜虹敓浠g爜锛岃繍琛屽垢绂忕▼搴忥紱鍗囩骇搴旂敤鍔熻兘锛岃秴鍑洪」鐩渶姹傘��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; + + } + + } + +} + + diff --git a/ZigbeeApp/Shared.Droid/UI/Enum.cs b/ZigbeeApp/Shared.Droid/UI/Enum.cs new file mode 100644 index 0000000..511ea6e --- /dev/null +++ b/ZigbeeApp/Shared.Droid/UI/Enum.cs @@ -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, + + } + + +} + + diff --git a/ZigbeeApp/Shared.Droid/UI/FrameLayout.cs b/ZigbeeApp/Shared.Droid/UI/FrameLayout.cs new file mode 100755 index 0000000..5fcd64f --- /dev/null +++ b/ZigbeeApp/Shared.Droid/UI/FrameLayout.cs @@ -0,0 +1,90 @@ +锘縰sing System; +using Android.Views; +using Android.Content; +using Android.Util; +using Android.Runtime; + +namespace Shared +{ + //宸茬粡鍏ㄩ潰妫�鏌ヤ簡浠g爜 + /// <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; + } + } + //宸茬粡鍏ㄩ潰妫�鏌ヤ簡浠g爜 + /// <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); + } + } + + //宸茬粡鍏ㄩ潰妫�鏌ヤ簡浠g爜 + /// <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); + } + + } +} diff --git a/ZigbeeApp/Shared.Droid/UI/GDMapView.cs b/ZigbeeApp/Shared.Droid/UI/GDMapView.cs new file mode 100644 index 0000000..504b6c5 --- /dev/null +++ b/ZigbeeApp/Shared.Droid/UI/GDMapView.cs @@ -0,0 +1,56 @@ +锘縰sing 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); + } + } + } +} \ No newline at end of file diff --git a/ZigbeeApp/Shared.Droid/UI/GestureLockView.cs b/ZigbeeApp/Shared.Droid/UI/GestureLockView.cs new file mode 100644 index 0000000..0fd8a73 --- /dev/null +++ b/ZigbeeApp/Shared.Droid/UI/GestureLockView.cs @@ -0,0 +1,152 @@ +锘縰sing 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> + /// 璁剧疆姝g‘鍜屾櫘閫氭椂鐨勯鑹� + /// </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> + /// 鏄剧ず鎵嬪娍瑙i攣view 鏄惁鏄剧ず姝g‘ + /// </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) + { + + } + + + } + + + + } +} \ No newline at end of file diff --git a/ZigbeeApp/Shared.Droid/UI/HorizontalPages.cs b/ZigbeeApp/Shared.Droid/UI/HorizontalPages.cs new file mode 100644 index 0000000..6532826 --- /dev/null +++ b/ZigbeeApp/Shared.Droid/UI/HorizontalPages.cs @@ -0,0 +1,530 @@ +锘縰sing System; +using Android.Views; +using Android.Content; +using Android.Widget; +using Android.Graphics.Drawables; + + +namespace Shared +{ + //宸茬粡鍏ㄩ潰妫�鏌ヤ簡浠g爜 + /// <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); + } + //璁板綍鐐瑰嚮鐨勬渶鏂癤鍧愭爣 + 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); + } + } +} + + + diff --git a/ZigbeeApp/Shared.Droid/UI/HorizontalScrolViewLayout.cs b/ZigbeeApp/Shared.Droid/UI/HorizontalScrolViewLayout.cs new file mode 100755 index 0000000..0762905 --- /dev/null +++ b/ZigbeeApp/Shared.Droid/UI/HorizontalScrolViewLayout.cs @@ -0,0 +1,214 @@ +using System; +using Android.Widget; +using Android.Views; +using Android.Content; +using Android.Util; +using Android.Runtime; + +namespace Shared +{ + //宸茬粡鍏ㄩ潰妫�鏌ヤ簡浠g爜 + /// <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> + /// 鏄惁姝e湪婊戝姩 + /// </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绛変簬楂樺害鏃讹紝鍗宠〃鏄庢粦鍔ㄥ埌搴曢儴锛屽彲鍙堥《灞俈iew鎺у埗婊戝姩 + 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); + } + } + +} diff --git a/ZigbeeApp/Shared.Droid/UI/HorizontalSeekBar.cs b/ZigbeeApp/Shared.Droid/UI/HorizontalSeekBar.cs new file mode 100644 index 0000000..697ba14 --- /dev/null +++ b/ZigbeeApp/Shared.Droid/UI/HorizontalSeekBar.cs @@ -0,0 +1,354 @@ +锘縰sing System; +using Android.Views; +using Android.Content; +using Android.Util; +using Android.Runtime; + +namespace Shared +{ + //宸茬粡鍏ㄩ潰妫�鏌ヤ簡浠g爜 + /// <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); + //璁板綍鐐瑰嚮鐨刋鍧愭爣 + 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; + } + } + } +} diff --git a/ZigbeeApp/Shared.Droid/UI/ImageView.cs b/ZigbeeApp/Shared.Droid/UI/ImageView.cs new file mode 100644 index 0000000..fc7f132 --- /dev/null +++ b/ZigbeeApp/Shared.Droid/UI/ImageView.cs @@ -0,0 +1,344 @@ +锘縰sing System; +using Android.Content; +using Android.Graphics; +using Android.Graphics.Drawables; +using Android.OS; +using Android.Util; +using Android.Views; + +namespace Shared +{ + //宸茬粡鍏ㄩ潰妫�鏌ヤ簡浠g爜 + /// <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; + + /** + * 缁樺浘鐨凱aint + */ + 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);// 榛樿涓篊ircle + + //a.recycle(); + } + + protected override void OnMeasure(int widthMeasureSpec, int heightMeasureSpec) + { + base.OnMeasure(widthMeasureSpec, heightMeasureSpec); + + ///** + // * 濡傛灉绫诲瀷鏄渾褰紝鍒欏己鍒舵敼鍙榲iew鐨勫楂樹竴鑷达紝浠ュ皬鍊间负鍑� + // */ + if (type == TYPE_CIRCLE) + { + mWidth = Math.Min(MeasuredWidth, MeasuredHeight); + mRadius = mWidth / 2; + SetMeasuredDimension(mWidth, mWidth); + } + } + + /** + * 鍒濆鍖朆itmapShader + */ + private void setUpShader() + { + Drawable drawable = this.Drawable; + if (drawable == null) + { + return; + } + + Bitmap bmp = drawableToBitamp(drawable); + if (bmp == null) + { + return; + } + // 灏哹mp浣滀负鐫�鑹插櫒锛屽氨鏄湪鎸囧畾鍖哄煙鍐呯粯鍒禸mp + 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)) + { + // 濡傛灉鍥剧墖鐨勫鎴栬�呴珮涓巚iew鐨勫楂樹笉鍖归厤锛岃绠楀嚭闇�瑕佺缉鏀剧殑姣斾緥锛涚缉鏀惧悗鐨勫浘鐗囩殑瀹介珮锛屼竴瀹氳澶т簬鎴戜滑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杞琤itmap + * + * @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); + } + } +} diff --git a/ZigbeeApp/Shared.Droid/UI/Lanuage.cs b/ZigbeeApp/Shared.Droid/UI/Lanuage.cs new file mode 100755 index 0000000..7dd508f --- /dev/null +++ b/ZigbeeApp/Shared.Droid/UI/Lanuage.cs @@ -0,0 +1,90 @@ +锘縰sing System; +using System.IO; + +namespace Shared +{ + public static class Language + { + static System.Collections.Generic.List<string> currentStringList; + static Language() + { + UpdateLanguage (); + if (0 < currentStringList.Count&¤tStringList[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("=")&¤tLine.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(); + } + } +} + diff --git a/ZigbeeApp/Shared.Droid/UI/Loading.cs b/ZigbeeApp/Shared.Droid/UI/Loading.cs new file mode 100644 index 0000000..cec4a46 --- /dev/null +++ b/ZigbeeApp/Shared.Droid/UI/Loading.cs @@ -0,0 +1,196 @@ +锘縰sing 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; + } + } +} \ No newline at end of file diff --git a/ZigbeeApp/Shared.Droid/UI/MusicVerticalScrolViewLayout.cs b/ZigbeeApp/Shared.Droid/UI/MusicVerticalScrolViewLayout.cs new file mode 100755 index 0000000..df34424 --- /dev/null +++ b/ZigbeeApp/Shared.Droid/UI/MusicVerticalScrolViewLayout.cs @@ -0,0 +1,418 @@ +锘縰sing 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; + } + //濡傛灉鏄粦鍔ㄨ繖閲屼篃浼氳繑鍥濼rue + 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闅忎究涓�鍒掞紝鍧愭爣鍙樺寲涓篨:{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; + } + } + } + +} diff --git a/ZigbeeApp/Shared.Droid/UI/MyEchartsView.cs b/ZigbeeApp/Shared.Droid/UI/MyEchartsView.cs new file mode 100755 index 0000000..d7db076 --- /dev/null +++ b/ZigbeeApp/Shared.Droid/UI/MyEchartsView.cs @@ -0,0 +1,182 @@ +锘縰sing 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" } } } } }; + } + } +} diff --git a/ZigbeeApp/Shared.Droid/UI/PageLayout.cs b/ZigbeeApp/Shared.Droid/UI/PageLayout.cs new file mode 100644 index 0000000..ad52e8c --- /dev/null +++ b/ZigbeeApp/Shared.Droid/UI/PageLayout.cs @@ -0,0 +1,801 @@ +using System; +using Android.Views; +using Android.Content; +using Android.Widget; +using Android.Graphics.Drawables; +using static ViewFlow; + +namespace Shared +{ + //宸茬粡鍏ㄩ潰妫�鏌ヤ簡浠g爜 + /// <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); + } + //璁板綍鐐瑰嚮鐨勬渶鏂癤鍧愭爣 + 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 - 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) + { + //濡傛灉鐖舵帶浠跺拰褰撳墠鎺т欢涓�鏍凤紝骞朵笖娌℃湁婊戝姩鍒板簳涔熸病鏈塪a + 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: 杩欓噷涓嶈兘鏄痝etScrollY() <= 0 + isScrolledToTop = true; + isScrolledToBottom = false; + } + else if (ScrollY + Height - PaddingTop - PaddingBottom == (0 < ChildCount ? GetChildAt(0).Height : Height)) + { + // 灏忓績韪╁潙2: 杩欓噷涓嶈兘鏄� >= + // 灏忓績韪╁潙3锛堝彲鑳藉拷瑙嗙殑缁嗚妭2锛夛細杩欓噷鏈�瀹规槗蹇借鐨勫氨鏄疭crollView涓婁笅鐨刾adding銆� + isScrolledToBottom = true; + isScrolledToTop = false; + } + else + { + isScrolledToTop = false; + isScrolledToBottom = false; + } + } + // 鏈夋椂鍊欏啓浠g爜涔犳儻浜嗭紝涓轰簡鍏煎涓�浜涜竟鐣屽钁╂儏鍐碉紝涓婇潰鐨勪唬鐮佸氨浼氬啓鎴�<=,>=鐨勬儏鍐碉紝缁撴灉灏卞嚭bug浜� + // 鎴戝啓鐨勬椂鍊欏啓鎴愯繖鏍凤細getScrollY() + getHeight() >= getChildAt(0).getHeight() + // 缁撴灉鍙戠幇蹇粦鍔ㄥ埌搴曢儴浣嗘槸杩樻病鍒版椂锛屼細鍙戠幇涓婇潰鐨勬潯浠舵垚绔嬩簡锛屽鑷村垽鏂敊璇� + // 鍘熷洜锛歡etScrollY()鍊间笉鏄粷瀵归潬璋辩殑锛屽畠浼氳秴杩囪竟鐣屽�硷紝浣嗘槸瀹冭嚜宸变細鎭㈠姝g‘锛屽鑷翠笂闈㈢殑璁$畻鏉′欢涓嶆垚绔� + // 浠旂粏鎯虫兂涔熸劅瑙夋兂寰楅�氾紝绯荤粺鐨凷crollView鍦ㄥ鐞嗘粴鍔ㄧ殑鏃跺�欏姩鎬佽绠楅偅涓猻crollY鐨勬椂鍊欎篃浼氬嚭鐜拌秴杩囪竟鐣屽啀淇鐨勬儏鍐� + } +} + diff --git a/ZigbeeApp/Shared.Droid/UI/PickerView.cs b/ZigbeeApp/Shared.Droid/UI/PickerView.cs new file mode 100644 index 0000000..a1a37fd --- /dev/null +++ b/ZigbeeApp/Shared.Droid/UI/PickerView.cs @@ -0,0 +1,241 @@ +锘縰sing 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鏂囧瓧锛宖alse鍒欐瘡椤筰tem鍏ㄩ儴閮藉甫鏈塴abel銆� + //.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鏂囧瓧锛宖alse鍒欐瘡椤筰tem鍏ㄩ儴閮藉甫鏈塴abel銆� + //.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鏂囧瓧锛宖alse鍒欐瘡椤筰tem鍏ㄩ儴閮藉甫鏈塴abel銆� + //.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); + } + } + } + +} + + + diff --git a/ZigbeeApp/Shared.Droid/UI/QRCode.cs b/ZigbeeApp/Shared.Droid/UI/QRCode.cs new file mode 100644 index 0000000..2b8a707 --- /dev/null +++ b/ZigbeeApp/Shared.Droid/UI/QRCode.cs @@ -0,0 +1,61 @@ +锘縰sing 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(); +// } +// } +// } +//} diff --git a/ZigbeeApp/Shared.Droid/UI/RowLayout.cs b/ZigbeeApp/Shared.Droid/UI/RowLayout.cs new file mode 100644 index 0000000..46e7af9 --- /dev/null +++ b/ZigbeeApp/Shared.Droid/UI/RowLayout.cs @@ -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 +{ + //宸茬粡鍏ㄩ潰妫�鏌ヤ簡浠g爜 + /// <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: + //璁板綍鐐瑰嚮鐨勬渶鏂癤鍧愭爣 + 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鍜孫nTouchEvent + /// </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); + } + } + } +} + + + diff --git a/ZigbeeApp/Shared.Droid/UI/Spinner.cs b/ZigbeeApp/Shared.Droid/UI/Spinner.cs new file mode 100644 index 0000000..51ed5f3 --- /dev/null +++ b/ZigbeeApp/Shared.Droid/UI/Spinner.cs @@ -0,0 +1,178 @@ +锘縰sing 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; + } + } +} + + diff --git a/ZigbeeApp/Shared.Droid/UI/SwipeLayout.cs b/ZigbeeApp/Shared.Droid/UI/SwipeLayout.cs new file mode 100755 index 0000000..c4cb92e --- /dev/null +++ b/ZigbeeApp/Shared.Droid/UI/SwipeLayout.cs @@ -0,0 +1,323 @@ +锘縰sing 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; + } + //濡傛灉鏄粦鍔ㄨ繖閲屼篃浼氳繑鍥濼rue + 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涓狝CTION_DOWN MotionEvent + // e2锛氭渶鍚庝竴涓狝CTION_MOVE MotionEvent + // velocityX锛歑杞翠笂鐨勭Щ鍔ㄩ�熷害锛堝儚绱�/绉掞級 + // velocityY锛歒杞翠笂鐨勭Щ鍔ㄩ�熷害锛堝儚绱�/绉掞級 + // 鍚戝乏婊� + 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; + } + } + } +} diff --git a/ZigbeeApp/Shared.Droid/UI/TextView.cs b/ZigbeeApp/Shared.Droid/UI/TextView.cs new file mode 100755 index 0000000..00ef50f --- /dev/null +++ b/ZigbeeApp/Shared.Droid/UI/TextView.cs @@ -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); + } + } + } +} diff --git a/ZigbeeApp/Shared.Droid/UI/TimeView.cs b/ZigbeeApp/Shared.Droid/UI/TimeView.cs new file mode 100644 index 0000000..343432c --- /dev/null +++ b/ZigbeeApp/Shared.Droid/UI/TimeView.cs @@ -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)); + } + } + } + } + + } +} \ No newline at end of file diff --git a/ZigbeeApp/Shared.Droid/UI/Tip.cs b/ZigbeeApp/Shared.Droid/UI/Tip.cs new file mode 100755 index 0000000..c1d9d46 --- /dev/null +++ b/ZigbeeApp/Shared.Droid/UI/Tip.cs @@ -0,0 +1,61 @@ +锘縰sing 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灞忓箷楂樺害鐨剏杞村亸绉婚噺 + 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); + } + + + } + +} + diff --git a/ZigbeeApp/Shared.Droid/UI/UICoverFlowView.cs b/ZigbeeApp/Shared.Droid/UI/UICoverFlowView.cs new file mode 100644 index 0000000..718ede9 --- /dev/null +++ b/ZigbeeApp/Shared.Droid/UI/UICoverFlowView.cs @@ -0,0 +1,326 @@ +锘縰sing 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; + + } + + + } + } +} \ No newline at end of file diff --git a/ZigbeeApp/Shared.Droid/UI/UIDrawerLayout.cs b/ZigbeeApp/Shared.Droid/UI/UIDrawerLayout.cs new file mode 100644 index 0000000..c8a36e7 --- /dev/null +++ b/ZigbeeApp/Shared.Droid/UI/UIDrawerLayout.cs @@ -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: + // //璁板綍鐐瑰嚮鐨勬渶鏂癤鍧愭爣 + // 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鍜孫nTouchEvent + ///// </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); + //} + } + } +} + + + diff --git a/ZigbeeApp/Shared.Droid/UI/UIPickerView.cs b/ZigbeeApp/Shared.Droid/UI/UIPickerView.cs new file mode 100644 index 0000000..d43b438 --- /dev/null +++ b/ZigbeeApp/Shared.Droid/UI/UIPickerView.cs @@ -0,0 +1,186 @@ +锘縰sing 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); + } + } + + + + } +} \ No newline at end of file diff --git a/ZigbeeApp/Shared.Droid/UI/UrlMonitor.cs b/ZigbeeApp/Shared.Droid/UI/UrlMonitor.cs new file mode 100755 index 0000000..a6b64a0 --- /dev/null +++ b/ZigbeeApp/Shared.Droid/UI/UrlMonitor.cs @@ -0,0 +1,94 @@ +锘縰sing 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; + } + } +} diff --git a/ZigbeeApp/Shared.Droid/UI/VerticalRefreshLayout.cs b/ZigbeeApp/Shared.Droid/UI/VerticalRefreshLayout.cs new file mode 100644 index 0000000..7a61d61 --- /dev/null +++ b/ZigbeeApp/Shared.Droid/UI/VerticalRefreshLayout.cs @@ -0,0 +1,360 @@ +using System;鈥╱sing 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> + ///// 鏄惁姝e湪婊戝姩 + ///// </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> + ///// 鏄惁姝e湪涓婃媺鍔犺浇 + ///// </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绛変簬楂樺害鏃讹紝鍗宠〃鏄庢粦鍔ㄥ埌搴曢儴锛屽彲鍙堥《灞俈iew鎺у埗婊戝姩 + // 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); + // } + //} + + + + +} + diff --git a/ZigbeeApp/Shared.Droid/UI/VerticalScrolViewLayout.cs b/ZigbeeApp/Shared.Droid/UI/VerticalScrolViewLayout.cs new file mode 100644 index 0000000..17598d2 --- /dev/null +++ b/ZigbeeApp/Shared.Droid/UI/VerticalScrolViewLayout.cs @@ -0,0 +1,42 @@ +using System;鈥╱sing Android.Widget;鈥╱sing Android.Content;鈥╱sing Android.Views;鈥╱sing Android.Util;鈥╱sing Android.Runtime;鈥ㄢ�╪amespace 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>鈥� /// 鏄惁姝e湪婊戝姩鈥� /// </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绛変簬楂樺害鏃讹紝鍗宠〃鏄庢粦鍔ㄥ埌搴曢儴锛屽彲鍙堥《灞俈iew鎺у埗婊戝姩 + 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);鈥� }鈥� }鈥▆ + diff --git a/ZigbeeApp/Shared.Droid/UI/VerticalSeekBar.cs b/ZigbeeApp/Shared.Droid/UI/VerticalSeekBar.cs new file mode 100644 index 0000000..1deebfd --- /dev/null +++ b/ZigbeeApp/Shared.Droid/UI/VerticalSeekBar.cs @@ -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 +{ + //宸茬粡鍏ㄩ潰妫�鏌ヤ簡浠g爜 + /// <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鍜孫nTouchEvent + /// </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; + } + } + } + } +} diff --git a/ZigbeeApp/Shared.Droid/UI/Video.cs b/ZigbeeApp/Shared.Droid/UI/Video.cs new file mode 100755 index 0000000..bf1a3cc --- /dev/null +++ b/ZigbeeApp/Shared.Droid/UI/Video.cs @@ -0,0 +1,217 @@ +锘縰sing 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"); +// } +// +// } +// +} + + diff --git a/ZigbeeApp/Shared.Droid/UI/View.cs b/ZigbeeApp/Shared.Droid/UI/View.cs new file mode 100644 index 0000000..86f3bc8 --- /dev/null +++ b/ZigbeeApp/Shared.Droid/UI/View.cs @@ -0,0 +1,1277 @@ +锘縰sing 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> + /// 褰撳墠瀵瑰簲鐨凙ndroidView鎺т欢 + /// </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> + /// 澶勭悊鐐瑰嚮浠g悊 + /// </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[]杞崲鎴怋itmap + 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; + } + } +} \ No newline at end of file diff --git a/ZigbeeApp/Shared.Droid/UI/ViewGroup.cs b/ZigbeeApp/Shared.Droid/UI/ViewGroup.cs new file mode 100644 index 0000000..a0d2161 --- /dev/null +++ b/ZigbeeApp/Shared.Droid/UI/ViewGroup.cs @@ -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--; + } + } + } + } +} + + diff --git a/ZigbeeApp/Shared.Droid/UI/WaveSeekBar.cs b/ZigbeeApp/Shared.Droid/UI/WaveSeekBar.cs new file mode 100644 index 0000000..968281a --- /dev/null +++ b/ZigbeeApp/Shared.Droid/UI/WaveSeekBar.cs @@ -0,0 +1,331 @@ +锘縰sing 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); + + } + } + } +} diff --git a/ZigbeeApp/Shared.Droid/UI/WiimuUPnp.cs b/ZigbeeApp/Shared.Droid/UI/WiimuUPnp.cs new file mode 100644 index 0000000..e988156 --- /dev/null +++ b/ZigbeeApp/Shared.Droid/UI/WiimuUPnp.cs @@ -0,0 +1,125 @@ +锘縰sing 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 鐨凷SID + */ + 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; + } + } + +} diff --git a/ZigbeeApp/Shared.Droid/Utils/HDLUtils.cs b/ZigbeeApp/Shared.Droid/Utils/HDLUtils.cs new file mode 100644 index 0000000..c042766 --- /dev/null +++ b/ZigbeeApp/Shared.Droid/Utils/HDLUtils.cs @@ -0,0 +1,44 @@ +锘縰sing 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); + //} + + + + } +} diff --git a/ZigbeeApp/Shared.Droid/Utils/TouchIDUtils.cs b/ZigbeeApp/Shared.Droid/Utils/TouchIDUtils.cs new file mode 100644 index 0000000..2f19c88 --- /dev/null +++ b/ZigbeeApp/Shared.Droid/Utils/TouchIDUtils.cs @@ -0,0 +1,205 @@ +锘縰sing 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锛歍ouch鏄剧ず鐨勬弿杩� + /// </summary> + /// <value>descTitle锛氳緭鍏ュ瘑鐮侀獙璇佹寜閽爣棰� mLocalizedReason锛歍ouch鏄剧ず鐨勬弿杩�</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锛坕nt errorCode, ICharSequence errString锛� 杩欎釜鎺ュ彛浼氬啀绯荤粺鎸囩汗璁よ瘉鍑虹幇涓嶅彲鎭㈠鐨勯敊璇殑鏃跺�欐墠浼氳皟鐢紝骞朵笖鍙傛暟errorCode灏辩粰鍑轰簡閿欒鐮侊紝鏍囪瘑浜嗛敊璇殑鍘熷洜銆� + // 鍦ˋndroidP浠ュ墠锛岃繖涓柟娉曞洖璋冨洖鏉ヤ箣鍚庯紝鎸囩汗璇嗗埆sensor灏嗕細琚叧闂紝涔熷氨鏄锛屼綘鍐嶆妸鎵嬫寚鏀惧湪鎸囩汗纭欢涓婏紝灏嗕笉浼氭湁鍙嶅簲浜嗐�傝繖鏃跺�欎綘闇�瑕佹彁绀虹敤鎴峰叧闂寚绾硅瘑鍒脊绐楋紝鎴栨敼鐢ㄥ瘑鐮佹敮浠樼瓑绛� + // 浠�涔堟儏鍐典笅浼氬洖璋僥rror閿欒鍛紵姣斿锛岃繛缁瘑鍒敊璇�5娆℃寚绾广�佹寚绾圭‖浠朵笉鍙敤绛夌瓑銆� + //鈶�. OnAuthenticationFailed()杩欎釜鎺ュ彛浼氬湪绯荤粺鎸囩汗璁よ瘉澶辫触鐨勬儏鍐电殑涓嬫墠浼氬洖璋冦�傛敞鎰忚繖閲岀殑璁よ瘉澶辫触鍜屼笂闈㈢殑璁よ瘉閿欒鏄笉涓�鏍风殑锛岃櫧鐒剁粨鏋滈兘鏄笉鑳借璇併�� + // 璁よ瘉澶辫触鏄寚鎵�鏈夌殑淇℃伅閮介噰闆嗗畬鏁达紝骞朵笖娌℃湁浠讳綍寮傚父锛屼絾鏄繖涓寚绾瑰拰涔嬪墠娉ㄥ唽鐨勬寚绾规槸涓嶇浉绗︾殑锛涗絾鏄璇侀敊璇槸鎸囧湪閲囬泦鎴栬�呰璇佺殑杩囩▼涓嚭鐜颁簡閿欒锛� + // 姣斿鎸囩汗浼犳劅鍣ㄥ伐浣滃紓甯哥瓑銆備篃灏辨槸璇磋璇佸け璐ユ槸涓�涓彲浠ラ鏈熺殑姝e父鎯呭喌锛岃�岃璇侀敊璇槸涓嶅彲棰勬湡鐨勫紓甯告儏鍐点�� + //鈶�.OnAuthenticationHelp(int helpMsgId, ICharSequence helpString)涓婇潰鐨勮璇佸け璐ユ槸璁よ瘉杩囩▼涓殑涓�涓紓甯告儏鍐碉紝鎴戜滑璇撮偅绉嶆儏鍐垫槸鍥犱负鍑虹幇浜嗕笉鍙仮澶嶇殑閿欒锛� + // 鑰屾垜浠繖閲岀殑OnAuthenticationHelp鏂规硶鏄嚭鐜颁簡鍙互鍥炲鐨勫紓甯告墠浼氳皟鐢ㄧ殑銆備粈涔堟槸鍙互鎭㈠鐨勫紓甯稿憿锛熶竴涓父瑙佺殑渚嬪瓙灏辨槸锛氭墜鎸囩Щ鍔ㄥお蹇紝褰撴垜浠妸鎵嬫寚鏀惧埌浼犳劅鍣ㄤ笂鐨勬椂鍊欙紝 + // 濡傛灉鎴戜滑寰堝揩鍦板皢鎵嬫寚绉昏蛋鐨勮瘽锛岄偅涔堟寚绾逛紶鎰熷櫒鍙兘鍙噰闆嗕簡閮ㄥ垎鐨勪俊鎭紝鍥犳璁よ瘉浼氬け璐ャ�備絾鏄繖涓敊璇槸鍙互鎭㈠鐨勶紝鍥犳鍙鎻愮ず鐢ㄦ埛鍐嶆鎸変笅鎸囩汗锛屽苟涓斾笉瑕佸お蹇Щ璧板氨鍙互瑙e喅銆� + //鈶�. OnAuthenticationSucceeded(FingerprintManagerCompati.AuthenticationResult result)杩欎釜鎺ュ彛浼氬湪璁よ瘉鎴愬姛涔嬪悗鍥炶皟銆傛垜浠彲浠ュ湪杩欎釜鏂规硶涓彁绀虹敤鎴疯璇佹垚鍔熴�� + // 杩欓噷闇�瑕佽鏄庝竴涓嬶紝濡傛灉鎴戜滑涓婇潰鍦ㄨ皟鐢╝uthenticate鐨勬椂鍊欙紝鎴戜滑鐨凜ryptoObject涓嶆槸null鐨勮瘽锛岄偅涔堟垜浠湪杩欎釜鏂规硶涓彲浠ラ�氳繃AuthenticationResult鏉ヨ幏寰桟ypher瀵硅薄鐒跺悗璋冪敤瀹冪殑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锛欵rror锛�" + mErrorStr.ToString()); + } + else { + System.Console.WriteLine("KK锛欵rror" + mErrorStr.ToString() + " CODE:" + mErrorId); + } + + } + + + public void OnAuthenticationFailed() + { + //throw new NotImplementedException(); + System.Console.WriteLine("KK锛欶ailed鏃犳硶璇嗗埆锛岃鍐嶈瘯涓�娆�"); + + } + + public void OnAuthenticationHelp(int mErrorId, ICharSequence mErrorStr) + { + //throw new NotImplementedException(); + //System.Console.WriteLine("KK锛欻elp鏃犳硶璇嗗埆锛岃鍐嶈瘯涓�娆�"); + System.Console.WriteLine("KK锛欵rror" + 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 --git a/ZigbeeApp/Shared/.DS_Store b/ZigbeeApp/Shared/.DS_Store index 0fda139..f0a3b80 100755 --- a/ZigbeeApp/Shared/.DS_Store +++ b/ZigbeeApp/Shared/.DS_Store Binary files differ diff --git a/ZigbeeApp/Shared/DLL/Android/Shared.Droid.dll b/ZigbeeApp/Shared/DLL/Android/Shared.Droid.dll index da6aa31..7e8316f 100644 --- a/ZigbeeApp/Shared/DLL/Android/Shared.Droid.dll +++ b/ZigbeeApp/Shared/DLL/Android/Shared.Droid.dll Binary files differ diff --git a/ZigbeeApp/Shared/Phone/UserView/UserHomeView.cs b/ZigbeeApp/Shared/Phone/UserView/UserHomeView.cs index 03ff3a0..050c746 100644 --- a/ZigbeeApp/Shared/Phone/UserView/UserHomeView.cs +++ b/ZigbeeApp/Shared/Phone/UserView/UserHomeView.cs @@ -631,16 +631,20 @@ if (CanBindGateway() == false) { - var roomPageView = new PageLayout() + + var roomPageView = new HorizontalPages() { Y = Application.GetRealHeight(302), - Width = Application.GetRealWidth(CommonPage.AppRealWidth - CommonPage.XLeft * 2), - Height = Application.GetMinRealAverage(roomPageView_Height), - Radius = CommonPage.BigFormRadius, - Gravity = Gravity.CenterHorizontal, - IsShowPoint = false + Width = Application.GetRealWidth(CommonPage.AppRealWidth), + Height = Application.GetRealHeight(478), + //Radius = CommonPage.BigFormRadius, + //Gravity = Gravity.CenterHorizontal, }; AddChidren(roomPageView); + //涓庡睆骞曡竟妗嗙殑杈硅窛 + roomPageView.RowPadding = Application.GetRealWidth(181); + //涓や釜page涔嬮棿鐨勯棿璺� + roomPageView.PagePadding = Application.GetRealWidth(69); //褰撳墠鎴块棿 //Room.CurrentRoom = Room.CurrentRoom == null ? Room.Lists[0] : Room.CurrentRoom; @@ -650,9 +654,13 @@ { var roomBackView = new FrameLayout() { - BackgroundImagePath = room.BackgroundImage + BackgroundImagePath = room.BackgroundImage, + Width = Application.GetRealWidth(717), + Height=Application.GetRealHeight(478), + Radius=(uint)Application.GetRealHeight(10) }; roomPageView.AddChidren(roomBackView); + if (room.BackgroundImageType != 0) { roomBackView.BackgroundImagePath = System.IO.Path.Combine(Config.Instance.FullPath, room.BackgroundImage); @@ -670,13 +678,13 @@ TextSize = 18, }; roomBackView.AddChidren(roomName); - var roomListBtn = new Device.CommonForm.SelectedStatuButton() + var roomListBtn = new Button() { - X = roomPageView.Width - Application.GetRealWidth(100 + 20), + X = roomBackView.Width - Application.GetRealWidth(100 + 20), Y = Application.GetRealHeight(20), Width = Application.GetMinRealAverage(100), Height = Application.GetMinRealAverage(100), - UnSelectedImagePath = "Item/List.png", + UnSelectedImagePath = "Room/List.png", }; roomBackView.AddChidren(roomListBtn); -- Gitblit v1.8.0