| | |
| | | <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> |
| | |
| | | </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> |
| | |
| | | {"Format":1,"ProjectReferences":[],"MetadataReferences":[{"FilePath":"/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/packages/BouncyCastle.Crypto.dll.1.8.1/lib/BouncyCastle.Crypto.dll","Aliases":[]},{"FilePath":"/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/DroidLib/bin/Debug/DroidLib.dll","Aliases":[]},{"FilePath":"/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/packages/FastAndroidCamera.2.0.0/lib/MonoAndroid403/FastAndroidCamera.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Java.Interop.dll","Aliases":[]},{"FilePath":"/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/DLL/M2Mqtt.Net.dll","Aliases":[]},{"FilePath":"/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/packages/Microsoft.AppCenter.Analytics.1.14.0/lib/MonoAndroid403/Microsoft.AppCenter.Analytics.Android.Bindings.dll","Aliases":[]},{"FilePath":"/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/packages/Microsoft.AppCenter.Analytics.1.14.0/lib/MonoAndroid403/Microsoft.AppCenter.Analytics.dll","Aliases":[]},{"FilePath":"/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/packages/Microsoft.AppCenter.1.14.0/lib/MonoAndroid403/Microsoft.AppCenter.Android.Bindings.dll","Aliases":[]},{"FilePath":"/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/packages/Microsoft.AppCenter.Crashes.1.14.0/lib/MonoAndroid403/Microsoft.AppCenter.Crashes.Android.Bindings.dll","Aliases":[]},{"FilePath":"/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/packages/Microsoft.AppCenter.Crashes.1.14.0/lib/MonoAndroid403/Microsoft.AppCenter.Crashes.dll","Aliases":[]},{"FilePath":"/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/packages/Microsoft.AppCenter.1.14.0/lib/MonoAndroid403/Microsoft.AppCenter.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v8.0/Mono.Android.dll","Aliases":[]},{"FilePath":"/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/packages/MQTTnet.2.4.0/lib/netstandard1.3/MQTTnet.Core.dll","Aliases":[]},{"FilePath":"/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/packages/MQTTnet.2.4.0/lib/netstandard1.3/MQTTnet.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/mscorlib.dll","Aliases":[]},{"FilePath":"/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/DLL/Newtonsoft.Json.dll","Aliases":[]},{"FilePath":"/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/DLL/Security.dll","Aliases":[]},{"FilePath":"/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/DLL/Android/Shared.Droid.dll","Aliases":[]},{"FilePath":"/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/DLL/Android/Shared.Droid.HDLWidget.dll","Aliases":[]},{"FilePath":"/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/DLL/Android/Shared.Droid.Smartrefresh.dll","Aliases":[]},{"FilePath":"/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/DLL/Android/Shared.Droid.TouchID.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/System.Core.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/System.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/System.IO.Compression.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/System.Net.Http.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Runtime.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/System.Web.Services.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/System.Xml.dll","Aliases":[]},{"FilePath":"/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/DLL/Android/Xamarin.Android.Arch.Core.Common.dll","Aliases":[]},{"FilePath":"/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/DLL/Android/Xamarin.Android.Arch.Lifecycle.Common.dll","Aliases":[]},{"FilePath":"/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/DLL/Android/Xamarin.Android.Arch.Lifecycle.Runtime.dll","Aliases":[]},{"FilePath":"/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/DLL/Android/Xamarin.Android.Support.Animated.Vector.Drawable.dll","Aliases":[]},{"FilePath":"/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/DLL/Android/Xamarin.Android.Support.Annotations.dll","Aliases":[]},{"FilePath":"/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/DLL/Android/Xamarin.Android.Support.Compat.dll","Aliases":[]},{"FilePath":"/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/DLL/Android/Xamarin.Android.Support.Core.UI.dll","Aliases":[]},{"FilePath":"/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/DLL/Android/Xamarin.Android.Support.Core.Utils.dll","Aliases":[]},{"FilePath":"/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/DLL/Android/Xamarin.Android.Support.Fragment.dll","Aliases":[]},{"FilePath":"/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/DLL/Android/Xamarin.Android.Support.Media.Compat.dll","Aliases":[]},{"FilePath":"/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/DLL/Android/Xamarin.Android.Support.v4.dll","Aliases":[]},{"FilePath":"/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/DLL/Android/Xamarin.Android.Support.v7.AppCompat.dll","Aliases":[]},{"FilePath":"/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/DLL/Android/Xamarin.Android.Support.v7.RecyclerView.dll","Aliases":[]},{"FilePath":"/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/DLL/Android/Xamarin.Android.Support.Vector.Drawable.dll","Aliases":[]},{"FilePath":"/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/packages/ZXing.Net.Mobile.2.4.1/lib/MonoAndroid71/ZXing.Net.Mobile.Core.dll","Aliases":[]},{"FilePath":"/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/packages/ZXing.Net.Mobile.2.4.1/lib/MonoAndroid71/zxing.portable.dll","Aliases":[]},{"FilePath":"/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/packages/ZXing.Net.Mobile.2.4.1/lib/MonoAndroid71/ZXingNetMobile.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Diagnostics.Contracts.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Diagnostics.FileVersionInfo.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Net.Security.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Xml.XPath.XDocument.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Net.WebSockets.Client.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.IO.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Dynamic.Runtime.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Runtime.Serialization.Xml.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Security.Principal.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Reflection.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Threading.ThreadPool.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Security.Cryptography.Cng.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.ComponentModel.EventBasedAsync.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Security.Cryptography.Encryption.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Runtime.CompilerServices.VisualC.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Threading.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Security.Cryptography.DeriveBytes.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/netstandard.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.IO.UnmanagedMemoryStream.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.ServiceModel.Http.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.IO.FileSystem.AccessControl.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Xml.XPath.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Xml.XmlDocument.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Xml.Xsl.Primitives.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Resources.Writer.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Console.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Net.Cache.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Net.Sockets.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Text.Encoding.Extensions.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Net.NetworkInformation.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Net.Utilities.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Security.Principal.Windows.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Security.Claims.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.ServiceModel.Primitives.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Security.Cryptography.Hashing.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.ComponentModel.Primitives.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.IO.FileSystem.DriveInfo.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Security.Cryptography.X509Certificates.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Reflection.Primitives.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Runtime.Numerics.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.IO.FileSystem.Watcher.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Diagnostics.TraceSource.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Reflection.Emit.Lightweight.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Text.Encoding.CodePages.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Linq.Expressions.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Threading.Timer.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Runtime.InteropServices.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.IO.Pipes.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Net.HttpListener.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Text.RegularExpressions.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Threading.Tasks.Parallel.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Collections.NonGeneric.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Collections.Concurrent.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Threading.Overlapped.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Security.Cryptography.Pkcs.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Runtime.Handles.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Data.SqlClient.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.ObjectModel.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Net.WebHeaderCollection.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Runtime.InteropServices.RuntimeInformation.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.ComponentModel.TypeConverter.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Net.Mail.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Threading.Tasks.Extensions.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Linq.Parallel.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Xml.XDocument.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Security.SecureString.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/Microsoft.Win32.Registry.AccessControl.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Security.Cryptography.RSA.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.ComponentModel.Annotations.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.IO.FileSystem.Primitives.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Security.Cryptography.Primitives.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.IO.Compression.ZipFile.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Runtime.InteropServices.WindowsRuntime.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Linq.Queryable.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Resources.ResourceManager.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Resources.Reader.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Collections.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Reflection.Emit.ILGeneration.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Data.Common.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Net.NameResolution.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.ComponentModel.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.ServiceProcess.ServiceController.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Security.Cryptography.Encryption.ECDiffieHellman.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Runtime.Loader.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.ServiceModel.Security.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Net.AuthenticationManager.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Xml.ReaderWriter.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Threading.Tasks.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Diagnostics.Tracing.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.AppContext.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Buffers.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Security.Cryptography.Encryption.ECDsa.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Security.Cryptography.Csp.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Diagnostics.TextWriterTraceListener.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Text.Encoding.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.IO.MemoryMappedFiles.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Security.Cryptography.OpenSsl.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/Microsoft.Win32.Registry.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Globalization.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Security.Cryptography.RandomNumberGenerator.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Collections.Specialized.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Security.Cryptography.ProtectedData.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.ValueTuple.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Xml.XPath.XmlDocument.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Net.ServicePoint.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Xml.XmlSerializer.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Reflection.Extensions.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Globalization.Extensions.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Runtime.Extensions.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Resources.ReaderWriter.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Security.Cryptography.Encoding.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.IO.IsolatedStorage.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Threading.AccessControl.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.ServiceModel.NetTcp.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Security.AccessControl.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Reflection.TypeExtensions.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Globalization.Calendars.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Net.Requests.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Net.WebSockets.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Reflection.Emit.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.IO.FileSystem.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Runtime.Serialization.Json.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Security.Cryptography.Algorithms.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Threading.Thread.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Linq.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Diagnostics.Process.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Diagnostics.Tools.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Security.Cryptography.Hashing.Algorithms.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Diagnostics.Debug.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/Microsoft.Win32.Primitives.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Runtime.Serialization.Primitives.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Diagnostics.TraceEvent.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Drawing.Primitives.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Runtime.Serialization.Formatters.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Net.Ping.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.ServiceModel.Duplex.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Diagnostics.StackTrace.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Reflection.DispatchProxy.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Security.Cryptography.Encryption.Aes.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Memory.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Net.Primitives.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Drawing.Common.dll","Aliases":[]}],"Files":["/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Application.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Resources/Resource.designer.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Properties/AssemblyInfo.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/app.config","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/packages.config","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Resources/AboutResources.txt","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Properties/AndroidManifest.xml","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Resources/layout/Main.axml","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Resources/values/Strings.xml","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Resources/values/Styles.xml","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/libs/armeabi-v7a/libelianjni.so","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/libs/armeabi-v7a/libjcore127.so","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Resources/drawable/Loading.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Resources/mipmap-xxhdpi/Icon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Resources/mipmap-mdpi/Icon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Resources/mipmap-hdpi/Icon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Resources/mipmap-xhdpi/Icon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Resources/mipmap-xxxhdpi/Icon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Resources/drawable/Icon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Resources/xml/file_paths.xml","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Language.ini","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Account/Account.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Account/Cancle.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Account/Cat.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Account/ChangeSuccess.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Account/Code.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Account/HidePwd.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Account/Logo_loginBG.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Account/Logo_White.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Account/Password.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Account/PhoneEmail_White.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Account/UnhidePwd.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/AC/Add.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/AC/Fan_Height.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/AC/Fan_HeightSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/AC/Fan_Low.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/AC/Fan_LowSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/AC/Fan_Middle.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/AC/Fan_MiddleSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/AC/Group.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/AC/Mode_Auto.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/AC/Mode_AutoSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/AC/Mode_Cool.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/AC/Mode_CoolSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/AC/Mode_Dry.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/AC/Mode_DrySelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/AC/Mode_Fan.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/AC/Mode_FanSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/AC/Mode_Heat.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/AC/Mode_HeatSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/AC/OpenOrClose.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/AC/OpenOrCloseSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/AC/Path.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/AC/Reduce.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/AC/SelectedFanModeBG.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/AC/SelectedModeBG.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/BindPic/BindAdd.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/BindPic/BindDown.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/BindPic/BindEmptyPic.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/BindPic/BindLeft.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/BindPic/BindRight.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Center/Abount.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Center/Admin.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Center/Backup.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Center/DeviceManagement.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Center/ImperialCrown.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Center/MenberManagement.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Center/Opinion.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Center/ResidenceManagement.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Center/SafetyManagement.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Device/AirConditioner.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Device/AirConditionerEpoint.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Device/AirConditionerZbGateway.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Device/AirSwitch.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Device/AirSwitchCloudContr.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Device/ButtonPanel.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Device/ButtonPanelFour.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Device/ButtonPanelOne.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Device/ButtonPanelThree.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Device/ButtonPanelTwo.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Device/ColorLight.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Device/Converter.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Device/ConverterZb485.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Device/Curtain.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Device/CurtainAutoOpen.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Device/CurtainSiphonate.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Device/DimmableLight.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Device/DimmableLightOneLoad.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Device/DryContact.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Device/IntelligentLocks.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Device/IntelligentLocksH06C.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Device/Light.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Device/PanelTable.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Device/Relay.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Device/RelayEpoint.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Device/RelayThreeLoad.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Device/Repeater.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Device/Sensor.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Device/SensorCarbonMonoxide.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Device/SensorDoorWindow.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Device/SensorEmergencyButton.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Device/SensorFire.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Device/SensorHumidity.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Device/SensorInfrared.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Device/SensorMotion.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Device/SensorPir.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Device/SensorTemperature.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Device/SensorWater.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Device/Socket1.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Device/Switch.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/DoorLock/AddFailedPic.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/DoorLock/AddFingerprintTipPic.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/DoorLock/AddIcCardTipPic.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/DoorLock/AddIcon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/DoorLock/AddPasswordTicPic.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/DoorLock/AllMethod.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/DoorLock/AllMethodIcon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/DoorLock/AllMethodOn.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/DoorLock/CancelIcon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/DoorLock/DateIcon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/DoorLock/DelIcon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/DoorLock/DistributeUnlockIcon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/DoorLock/DooorLockPicOpen.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/DoorLock/DoorLockClose.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/DoorLock/DoorlockIcon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/DoorLock/DoorLockOpen.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/DoorLock/DoorLockPicClose.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/DoorLock/DoorlockPicture.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/DoorLock/DoorLockUserPic.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/DoorLock/EntrySuccessIcon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/DoorLock/FavoriteIcon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/DoorLock/Fingerprint.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/DoorLock/Fingerprint207.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/DoorLock/FingerprintOn.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/DoorLock/Left.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/DoorLock/MemberIcon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/DoorLock/Password.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/DoorLock/PasswordOn.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/DoorLock/proximityCard.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/DoorLock/proximityCardOn.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/DoorLock/RecordIcon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/DoorLock/RemoteUnlockIcon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/DoorLock/RightIcon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/DoorLock/RoomPic.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/DoorLock/SelectedIcon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/DoorLock/SettingIcon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/DoorLock/ShareIcon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/DoorLock/SideslipPic.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/DoorLock/Switch.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/DoorLock/SwitchOn.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/DoorLock/TemPasswordVisiable.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/DoorLock/TempPasswordBackground.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/DoorLock/TempPasswordBackground1.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/DoorLock/TypeIcon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/DoorLock/UndistributeIcon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/DoorLock/UnLockBlankPic.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/DoorLock/UnLockButton.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/DoorLock/UnlockFailed.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/DoorLock/UnLockSideslipIcon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/DoorLock/UnlockSuccess.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/DoorLock/UnselectedIcon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/DoorLock/VisitorIcon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Floor/Floor.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Floor/FloorSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/FunctionIcon/10Icon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/FunctionIcon/10IconSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/FunctionIcon/11Icon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/FunctionIcon/11IconSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/FunctionIcon/12Icon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/FunctionIcon/12IconSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/FunctionIcon/13Icon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/FunctionIcon/13IconSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/FunctionIcon/14Icon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/FunctionIcon/14IconSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/FunctionIcon/15Icon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/FunctionIcon/15IconSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/FunctionIcon/16Icon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/FunctionIcon/16IconSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/FunctionIcon/17Icon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/FunctionIcon/17IconSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/FunctionIcon/18Icon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/FunctionIcon/18IconSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/FunctionIcon/19Icon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/FunctionIcon/19IconSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/FunctionIcon/1Icon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/FunctionIcon/1IconSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/FunctionIcon/20Icon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/FunctionIcon/20IconSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/FunctionIcon/2Icon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/FunctionIcon/2IconSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/FunctionIcon/3Icon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/FunctionIcon/3IconSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/FunctionIcon/4Icon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/FunctionIcon/4IconSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/FunctionIcon/5Icon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/FunctionIcon/5IconSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/FunctionIcon/6Icon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/FunctionIcon/6IconSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/FunctionIcon/7Icon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/FunctionIcon/7IconSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/FunctionIcon/8Icon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/FunctionIcon/8IconSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/FunctionIcon/9Icon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/FunctionIcon/9IconSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Gateway/GatewayIcon1.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Gateway/GatewayIcon6.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Gateway/RealGateway1.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Gateway/RealGateway6.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Gateway/WiredGateway.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Gateway/WiredGatewayInstruct.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Instruct/DeviceSearch.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Instruct/DimmableLightOneLoad.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Instruct/IntelligentLocksH06C.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Instruct/PanelFourButton.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Instruct/PanelThreeButton.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Instruct/PanelTwoButton.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Instruct/RelayThreeLoad.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/Add.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/Add_Category.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/Add_GW.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/Back.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/BottomShadow.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/CancelIcon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/Category_FunctionBG.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/Category_FunctionBGSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/Check.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/CloseIcon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/Collection.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/Collection1.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/CollectionSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/CollectionSelected1.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/DateSearchIcon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/DeleteIcon1.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/DeleteIcon2.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/DeleteIcon2Selected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/Down.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/DownLoad.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/Drop_Down.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/FixedPosition.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/FixedPositionSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/Floor.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/ForgotPswList.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/FunctionCardView.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/FunctionCardViewSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/FunctionViewBG.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/GarrisonList.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/GarrisonListSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/HidenPWD.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/House.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/HouseSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/ItemSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/More.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/NewVersion.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/Next.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/NoBindGW.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/NoFunction.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/OpenIcon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/PersentIcon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/PickerColorWheel.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/Point.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/ProgressMsg.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/PswSettion.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/PswSettionSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/QRCode.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/Remote.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/ResidenceIcon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/RightIcon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/Room.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/RoomIcon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/SceneCard.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/SceneFunctionBG.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/ScreeningType.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/Search.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/SelectFloor_Left.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/SelectHouse.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/ShardMenu.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/Switch.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/Switch1.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/Switch2.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/Switch2Selected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/SwitchSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/SwitchSelected1.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/Time.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/Timer.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/Tips.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/UnHidenPWD.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/UnLockFail.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/UnLockSuccess.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/UpperTriangle.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/VirtualFrame.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/WrongIcon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Logo/Logo.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Navigation/Category.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Navigation/CategorySelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Navigation/Home.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Navigation/HomeSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Navigation/Setting.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Navigation/SettingSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/RealDevice/AirSwitchCloudContr.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/RealDevice/CommonDevice.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/RealDevice/CurtainAutoOpen.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/RealDevice/CurtainSiphonate.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/RealDevice/ButtonPanelFour.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/RealDevice/ButtonPanelFourNotPower.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/RealDevice/ButtonPanelThree.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/RealDevice/ButtonPanelTwo.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/RealDevice/SensorCarbonMonoxide.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/RealDevice/SensorDoorWindow.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/RealDevice/SensorEmergencyButton.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/RealDevice/SensorFire.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/RealDevice/SensorInfrared.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/RealDevice/SensorMotion.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/RealDevice/SensorPir.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/RealDevice/SensorWater.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Room/RoomCardView.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Room/RoomCardView_Name.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Room/Room_Rectangle.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Safeguard/ProtectionAtHome.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Safeguard/ProtectionAtHomeSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Safeguard/ProtectionRemoveHome.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Safeguard/ProtectionRemoveHomeSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Safeguard/WithdrawGarrison.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Safeguard/WithdrawGarrisonSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Account/Back.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Scene/Delaying.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/AC/AC_TIP.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/RoomIcon/0.JPG","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/RoomIcon/1.JPG","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/RoomIcon/2.JPG","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/RoomIcon/3.JPG","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/RoomIcon/4.JPG","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/RoomIcon/5.JPG","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/SceneIcon/0.jpg","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/SceneIcon/1.jpg","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/SceneIcon/2.jpg","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/SceneIcon/3.jpg","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/SceneIcon/4.jpg","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/SceneIcon/5.jpg","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/SceneIcon/6.jpg","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/SceneIcon/7.jpg","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/SceneIcon/8.jpg","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/SceneIcon/9.jpg","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/InputAccountIcon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/InputAccountIconSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/MemberNotEsixtPic.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/NotAuthority.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/NotShardPic.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/ScanQRcodeIcon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/ScanQRcodeIconSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/1.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/2.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/3.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/ac.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/add.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/AddSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/airswitch.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/athome.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/back.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/connect.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/curtain.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/Ddmmablelight.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/delay.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/delay1.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/deviceselectedbackgroundcolor.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/deviceunselectedbackgroundcolor.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/dimmableLight.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/doorlock.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/drop-down.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/dropdown.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/function.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/function1.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/humidity.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/iconBackgroundColor.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/iconSelectedBackgroundColor.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/leavehome.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/light.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/light_1.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/logicaddcolor.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/logicbj1.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/logicbj2.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/logicclose.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/logicopen.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/next.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/nodelay.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/nofunction.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/noon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/noscene.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/nosecurity.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/panel.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/point.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/position.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/scene.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/scene1.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/security.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/security1.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/selected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/selectedac.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/selectedairswitch.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/selectedcurtain.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/selecteddimmableLight.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/selecteddoorlock.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/selectedlight.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/selectedmonth.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/selectedpanel.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/selectedsenor.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/selectedsensor13.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/selectedsensor21.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/selectedsensor22.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/selectedsensor277.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/selectedsensor40.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/selectedsensor42.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/selectedsensor43.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/selectedsensor44.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/sensor13.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/sensor21.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/sensor22.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/sensor277.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/sensor40.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/sensor42.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/sensor43.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/sensor44.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/sign.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/sunrise.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/sunset.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/temperature.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/time.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/timeparagraph.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/timepoint.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/withdrawal.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/ItemUnSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Gateway/WiredGatewaySearching.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/BottomButtonGround.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/FailIcon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Light/DeskLamp.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Light/DeskLampSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/Message.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/MessageSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/MyHome.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/NextSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/SelectFloor_Right.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/Shared.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/RoomIconBackground.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/RoomIconBackgroundSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Room/FavoriteRoom.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Room/ItemSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Room/ItemUnSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Room/ItemUnSelected_Black.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Room/NoNameRoom.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/DoorLock/DelBackground.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/DoorLock/TemPasswordInvisiable.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/GwSwitchIcon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/GwSwitchIconSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Instruct/CurtainAutoOpen.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/DeviceLimitGround.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/DownTriangle.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/UpTriangle.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/DeviceLimitGroundSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Instruct/CurtainSiphonate.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Instruct/SensorInfrared.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Instruct/SensorDoorWindow.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Instruct/SensorCarbonMonoxide.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Instruct/SensorWater.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Instruct/AirSwitchCloudContr.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Instruct/RepeaterZigbee.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Instruct/AirConditionerZbGateway.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Device/RepeaterZigbee.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Instruct/SensorFire.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/lockadd.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/selectedhumidity.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/selectedtemperature.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/CreatFloor.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/CreatFloorSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/RoomIconSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Device/AirConditionerEpointSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/WarningIcon1.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/AC/Mode_Cool2.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/AC/Mode_Dry2.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/AC/Mode_Fan2.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/AC/Mode_Heat2.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/IndoorUnitGround.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/BindPic/BindRoomColor.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/BindPic/BindRoomColorOn.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Scene/SceneIcon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Scene/Selected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Safeguard/SafetyShortcut.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Safeguard/SafetyShortcutSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Device/ThirdPartyDevice.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Account/QQ.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Account/Wechat.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/HadAuthority.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Safeguard/SafeguardPasswordGround.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/PhoneBook.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/RollerShade/Close.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/RollerShade/CloseSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/RollerShade/Down.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/RollerShade/DownSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/RollerShade/Open.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/RollerShade/OpenSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/RollerShade/Stop.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/RollerShade/StopSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/RollerShade/Up.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/RollerShade/UpSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Gateway/AddGatewaySuccess.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Gateway/WirelessGatewaySearching.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/DroidLib/DroidLib.csproj","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Light/OFF.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Light/OFFSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Light/ON.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Light/OnOff.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Light/ONSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Light/Plug.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Light/PlugSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Gateway/WirelessApDirection.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Gateway/WirelessApGatewaySearching.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Gateway/WirelessGateway.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Loading/1.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Loading/10.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Loading/11.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Loading/12.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Loading/13.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Loading/14.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Loading/15.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Loading/16.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Loading/17.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Loading/18.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Loading/19.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Loading/2.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Loading/20.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Loading/21.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Loading/22.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Loading/23.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Loading/24.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Loading/25.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Loading/26.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Loading/27.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Loading/28.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Loading/29.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Loading/3.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Loading/30.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Loading/31.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Loading/32.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Loading/4.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Loading/5.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Loading/6.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Loading/7.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Loading/8.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Loading/9.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/AC/Swing_1.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/AC/Swing_1Selected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/AC/Swing_2.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/AC/Swing_2Selected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/AC/Swing_3.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/AC/Swing_3Selected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/AC/Swing_4.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/AC/Swing_4Selected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/AC/Swing_5.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/AC/Swing_5Selected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/AC/Swing_Auto.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/AC/Swing_AutoSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/AC/SwingBackground.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Common/ComparerDeviceUI.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Common/Device.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Common/House.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Common/Logic.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Common/ResponseEntity/ApkInfoOBJ.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Common/ResponseEntity/FirmwareManaRes.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Common/ResponseEntity/GetAppVersionCode.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Common/ResponseEntity/ResultPack.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Common/ResponseEntity/UserLoginLocalRegionRes.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Pad/MainPage.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/R.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Common/ZigbeeColor.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Common/CommonPage.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Common/ResultStatus.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Common/ResponseEntity/BackupInfoRes.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Common/ResponseEntity/FolderRes.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Common/ResponseEntity/GatewayRes.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Common/ResponseEntity/GetAreaCode.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Common/ResponseEntity/ResidenceRes.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Common/ResponseEntity/ResponsePack.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Common/ResponseEntity/UserLoginRes.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Common/ResponseEntity/UserRegisterReqDto.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Common/SendDataToServer.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Common/Room.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Common/DeviceUI.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Common/SceneUI.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Common/SceneTargetDeviceUI.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Common/SceneRoomUI.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Common/ResponseEntity/AuthUserRes.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserView/UserPage.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserView/HomePage.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserView/UserHomeView.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/HdlBackup/HdlBackupListForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/HdlBackup/HdlGatewayBackUpForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/HdlBackup/HdlGatewayListBackUpForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Residence/LookRoomDeviceListForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Residence/FloorListRoomForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Residence/LookRoomSettionForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Residence/ResidenceListForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Residence/AddNewRoomForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Residence/EditorRoomInforForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Residence/ResidenceManagementForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Password/CheckOldPhoneForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Password/EditorGesturePasswordForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Password/ForgotSecondaryPasswordForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Password/CheckNewPhoneForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Password/ResetAccountPasswordForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Password/CheckOldEmailForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Password/EditorAccountPasswordForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Password/ForgotAccountPasswordForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Password/CheckNewEmailForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Password/EditorSecondaryPasswordForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Suggestion/FeedbackForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Member/AddMemberSuccessForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Member/AddMemberByIdForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Member/MemberNotEsixtForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Member/AddMemberInfoForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Member/MemberManagementForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Member/SubAccountLevelUpSuccessForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Member/MemberListForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/SharedContent/LookSharedContentForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/SharedContent/LookSharedListRoomForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/SharedContent/AddNewSharedListRoomForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/SharedContent/AddNewSharedContentForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Safety/AlarmTargetAddMenuForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Safety/GarrisonAreaSettionMenuForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Safety/GarrisonAreaDelayedSettionForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Safety/CoercePswEditorForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Safety/PasswordListUserForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Safety/AlarmTargetStatuSelectSwitchForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Safety/GarrisonAreaListMenuForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Safety/AlarmTargetExistSettionForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Safety/SafetyManagementMainForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Safety/PasswordAddNewForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Safety/AlarmTargetAddSceneForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Safety/CoercePswAddContactForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Safety/GarrisonAreaExistSensorForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Safety/PasswordMenuForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Safety/AlarmTargetAddDeviceForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Safety/AlarmTargetStatuSelectLightForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Safety/CoercePswAddNewForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Safety/AlarmTargetStatuSelectCurtainForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Safety/PasswordUserEditorForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/OtherParty/OtherPartyAccountMenuForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/DoorLock/UndistributeDoorlockUserPage.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/DoorLock/HistoryRecordPage.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/DoorLock/MemberManagement.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/DoorLock/EntryStatusPage.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/DoorLock/MemberFrozenPage.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/DoorLock/DoorLockCommonLayout.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/DoorLock/FunctionSetting.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/DoorLock/AddUnLockMethodTip.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/DoorLock/FunctionSettingSub.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/DoorLock/MasterManagementPage.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/DoorLock/UnLockMethod.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/DoorLock/TimeSettignPage.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/DoorLock/DoorlockDialog.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/DoorLock/UserDoorLockPage.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/DoorLock/UserManagement.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/DoorLock/AddUnLockMethod.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/DoorLock/TemporaryPassword.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/DoorLock/DoorLockCommonInfo.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Abount/AbountForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Device/DeviceAddSuccessForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Device/DeviceFirmwareUpdateForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Device/DeviceFunctionSettionForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Device/DeviceGeneralInformationForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Device/DeviceSearchForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Device/DeviceHistoryFirmwareVersionForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Device/DeviceDryContactSettionForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Device/DeviceFirmwareInfoForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Device/DeviceMacInfoEditorForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Device/DeviceListMainForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Device/Panel/PanelFunctionSettionForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Device/Panel/PanelButtonSettionForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Device/Panel/PanelBackLightSettionForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Device/Panel/PanelColorSelectForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Device/Curtain/AutoOpenDirectionAndLimitSettionForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Device/Curtain/SiphonateDirectionAndLimitSettionForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Device/PirSensor/PirSensorTargetSelectForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Device/PirSensor/PirSensorBindTargetSettionForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Device/DoorLock/DoorLockScreeningTypeForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Device/DoorLock/DoorLockHistoryLogForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Device/AirConditioner/IndoorUnitSettionForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Device/AirConditioner/AirConditionerModeForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Device/AirConditioner/IndoorUnitListForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Device/Direction/CurtainSiphonateDirectionForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Device/Direction/RelayThreeLoadDirectionForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Device/Direction/DimmableLightOneLoadDirectionForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Device/Direction/RepeaterZigbeeDirectionForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Device/Direction/SensorPirDirectionForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Device/Direction/AirConditionerZbGatewayDirectionForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Device/Direction/IntelligentLocksH06cDirectionForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Device/Direction/PanelThreeButtonDirectionForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Device/Direction/SensorWaterDirectionForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Device/Direction/SensorDoorWindowDirectionForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Device/Direction/AirSwitchCloudContrDirectionForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Device/Direction/AddDeviceTypeListForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Device/Direction/SensorInfraredDirectionForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Device/Direction/SensorCarbonMonoxideDirectionForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Device/Direction/PanelFourButtonDirectionForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Device/Direction/CurtainAutoOpenDirectionForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Device/Direction/PanelTwoButtonDirectionForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Device/Direction/SensorFireDirectionForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Device/Direction/CommonForm/DirectionCommonForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Device/Direction/Help/DeviceDirectionHelpForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Device/Relay/RelayThreeLoadBackLightSettionForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Device/Bind/AddScenePage.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Device/Bind/AddDevicePage.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Device/Bind/ChooseKeyModePage.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Device/Bind/BindTargetsPage.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Device/Bind/BindCommonLayout.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Device/Bind/BindInfo.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/UserMain/QRCodeForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/UserMain/UserInformationForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/UserMain/SecondAuthenticationForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/UserMain/UserMainForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Resourse/ControlCommonResourse.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Resourse/UserCenterResourse.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Resourse/GatewayResourse.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Resourse/FirmwareUpdateResourse.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Resourse/DirectoryFileNameResourse.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Form/PswSecondarySecurityForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Form/NumberPswInputDialogForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Form/BottomMenuSelectForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Form/SelectDeviceForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Form/PswGestureSecirityForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Form/BottomItemSelectForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Form/AreaCodeSelectForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Form/DialogInputForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Form/Base/CommonFormBase.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Form/Base/EditorCommonForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Form/Base/DialogCommonForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Logic/HdlSafeguardLogic.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Logic/HdlBackupLogic.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Logic/HdlFirmwareUpdateLogic.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Logic/HdlThreadLogic.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Logic/HdlDeviceUpdateLogic.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Logic/UserCenterLogic.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Logic/HdlAlarmsLogic.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Logic/HdlDeviceAttributeLogic.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Logic/HdlDeviceHardInfoLogic.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Logic/HdlGatewayReceiveLogic.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Logic/HdlShardLogic.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Logic/HdlLogLogic.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Logic/HdlDeviceImageInfoLogic.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Logic/HdlGatewayBackupLogic.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Logic/HdlDeviceCurtainLogic.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Logic/HdlWifiLogic.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Logic/HdlJiguangMsgPushLogic.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Logic/HdlAutoBackupLogic.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Logic/HdlDeviceBindLogic.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Logic/HdlDevicePirSensorLogic.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Logic/HdlCheckLogic.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Logic/HdlDeviceFixedAttributeLogic.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Logic/HdlGatewayUpdateLogic.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Logic/HdlDevicePanelLogic.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Logic/HdlDeviceAirConditionerLogic.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Logic/HdlGatewayLogic.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Common/IMessageCommon.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Common/UserCenterCommon.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Common/GatewayBackupEnum.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Common/UserCenterColor.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Common/UserCenterEnumCommon.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Common/AccountOption.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Controls/NormalControls/PicViewControl.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Controls/NormalControls/NormalViewControl.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Controls/NormalControls/BackViewControl.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Controls/NormalControls/IconViewControl.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Controls/NormalControls/InformationTipView.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Controls/NormalControls/MostRightIconControl.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Controls/NormalControls/DetailTitleControl.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Controls/NormalControls/TopLayoutTitleControl.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Controls/NormalControls/DateSelectControl.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Controls/NormalControls/LoadingControl.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Controls/TextInputControls/TextInputControl.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Controls/TextInputControls/TextInputExControl.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Controls/FrameLayoutControls/FrameCaptionViewControl.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Controls/FrameLayoutControls/FrameRowControl.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Controls/FrameLayoutControls/FrameCaptionInputControl.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Controls/FrameLayoutControls/FrameLayoutControl.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Controls/FrameLayoutControls/FrameListControl.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Controls/SceneControls/SceneSimpleSelectControl.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Controls/SceneControls/SceneRoomControl.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Controls/DeviceControls/DeviceInfoIconControl.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Controls/DeviceControls/GatewayRowControl.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Controls/DeviceControls/DeviceSelectControl.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Controls/DeviceControls/DeviceObjectControl.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Controls/DeviceControls/DeviceRoomControl.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Controls/RowLayoutControls/RowNewVersionTipView.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Controls/RowLayoutControls/RowLayoutControl.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Controls/RowLayoutControls/RowMostRightTextView.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Controls/ListViewLayoutControls/VerticalListControl.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Controls/ListViewLayoutControls/VerticalFrameControl.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Controls/ClickButtonControls/BottomClickButton.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Controls/ClickButtonControls/NormalClickButton.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Controls/CompoundControls/SafeguardLogControl.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Controls/CompoundControls/TopRightMenuControl.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Controls/CompoundControls/RoomDeviceGroupMenuControl.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Controls/CompoundControls/PswGestureInputControl.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Controls/CompoundControls/NormalSelectControl.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Controls/CompoundControls/CutPictureControl.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Controls/CompoundControls/VerificationCodeControl.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Controls/CompoundControls/DeviceInformationListControl.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Controls/CompoundControls/ProgressFormBar.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Controls/CompoundControls/PswNumberInputControl.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Controls/CompoundControls/MsgControls.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Controls/CompoundControls/BelongAreaControl.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Controls/CompoundControls/InformationEditorControl.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Controls/CompoundControls/SceneFunctionSwitchControl.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Controls/CompoundControls/SearchEditText.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Controls/CompoundControls/SafetyMasterControl.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Controls/CompoundControls/ProgressBar.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Controls/CompoundControls/SafetySensorStatuControl.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Controls/BaseCommonControl/Common/IconControlCommon.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Controls/BaseCommonControl/Common/ClickButtonCommon.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Controls/BaseCommonControl/Base/TextInputBase.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Controls/BaseCommonControl/Base/ButtonBase.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Gateway/Update/GatewayFirmwareUpdateForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Gateway/Update/GatewayCoordinatorInfoForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Gateway/Update/GatewayVirtualDriveInfoForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Gateway/Update/GatewayFirmwareInfoForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Gateway/Update/GatewayHistoryFirmwareVersionForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Gateway/Update/GatewayLinuxInfoForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Gateway/Add/WirelessUdpSelectNetworkForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Gateway/Add/NewGateWayMenuSelectForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Gateway/Add/WirelessApSelectNetworkForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Gateway/Add/WirelessApDirection3Form.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Gateway/Add/WirelessUdpSearchForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Gateway/Add/WirelessApDirection1Form.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Gateway/Add/WiredGatewaySearchForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Gateway/Add/WiredGatewayDirectionForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Gateway/Add/WirelessApDirection2Form.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Gateway/Add/WirelessUdpDirectionForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Gateway/Add/WirelessApSearchForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Gateway/Manage/GatewayInfoEditorForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Gateway/Manage/GatewayAddSuccessForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Gateway/Manage/GatewayListForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Gateway/Manage/GatewayProductInfoForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Gateway/Manage/GatewaySearchListForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Gateway/Manage/GatewayGeneralInformationForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Gateway/Manage/GatewayBackUpListForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Gateway/Manage/GatewayRebindForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Gateway/Manage/GatewayUploadAndDownLoadForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/ZigBee/IO/LocalFileUtils.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/ZigBee/Common/BigInteger.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/ZigBee/Common/OwnCodes.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/ZigBee/Common/Config.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/ZigBee/Common/Global.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/ZigBee/Common/CloudMqttResponsePack.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/ZigBee/Common/IStatus.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/ZigBee/Common/EncryptionService.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/ZigBee/Common/Application.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/ZigBee/Common/CommonInfo.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/ZigBee/Common/SendDataToGateway.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/ZigBee/Common/RemoteOperatorConsts.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/ZigBee/Common/SecuritySet.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/ZigBee/Device/ThirdPartyModuleUpgrade.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/ZigBee/Device/Safeguard.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/ZigBee/Device/LogicBase.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/ZigBee/Device/CommonDevice.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/ZigBee/Device/Scene.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/ZigBee/Device/Logic.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/ZigBee/Device/TemperatureSensor.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/ZigBee/Device/ZbGateway.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/ZigBee/Device/ZbGatewayData.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/ZigBee/Device/AC.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/ZigBee/Device/ThermostatObj.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/ZigBee/Device/Transverter.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/ZigBee/Device/Rollershade.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/ZigBee/Device/CurtainBase.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/ZigBee/Device/Repeater.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/ZigBee/Device/Enum.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/ZigBee/Device/BindObj.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/ZigBee/Device/AirSwitch.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/ZigBee/Device/Panel.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/ZigBee/Device/PIRSensor.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/ZigBee/Device/IASZone.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/ZigBee/Device/DeviceType.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/ZigBee/Device/DoorLock.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/ZigBee/Device/HDLbutton.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/ZigBee/Device/LigthtBase.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/ZigBee/Device/OTADevice.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/ZigBee/Device/ColorDimmableLight.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/ZigBee/Device/ToggleLight.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/ZigBee/Device/DimmableLight.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Room/UnallocatedRoom.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Room/EditRoom.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Room/RoomHumiditySetting.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Room/RoomManagement.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Room/AddRoomSelectPicByLocal.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Room/RoomTemperatureSetting.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Room/RoomShareSetting.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Room/RoomCommon.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/AC/ACControl.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/AC/ACControlBase.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Category/SelectDelayTime.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Category/CategorySceneSelectImgByLocal.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Category/SelectDevice.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Category/CategoryAddScene.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Category/SelectScene.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Category/SelectFloor.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Category/Category.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Curtain/RollerShadeControl.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Logic/Send.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Logic/EveryyearPage.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Logic/SelectedLogicState.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Logic/TemplatePage.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Logic/LogicMain.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Logic/SelectedLogicStatus.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Logic/AddScenePage.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Logic/LogicDevicePage.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Logic/SelectedLogic.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Logic/LogicCommunalPage.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Logic/MemberList.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Logic/Cycle.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Logic/TimePage.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Logic/EverymonthPage.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Logic/LogicIfon.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Logic/LogicListAutomation.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Logic/TemplateDeviceCondition.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Logic/DelayTime.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Logic/CyclicCycle.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Logic/AddLogicPage.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Logic/TimePoint.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Logic/DeviceStateCondition.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Logic/DeviceTarget.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Logic/LogicListPage.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Logic/TemplateDeviceAction.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Logic/IgnoreTime.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Logic/SelectedButton.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Logic/SecurityMode.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Logic/WeekPage.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Logic/CustomText.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Logic/DoorLockLogic/LockAddDevice.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Logic/DoorLockLogic/AddAction.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Logic/DoorLockLogic/LockLogicCommunalPage.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Logic/DoorLockLogic/LockAddScene.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Logic/DoorLockLogic/LockLogicList.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Logic/DoorLockLogic/AddCondition.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/CommonForm/SelectTime.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/CommonForm/Line.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/CommonForm/FunctionRow.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/CommonForm/SelectFunctionView.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/CommonForm/RoomNoNameMainView.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/CommonForm/DeviceInfoRow.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/CommonForm/TopFrameLayout.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/CommonForm/DeviceInfoWithZoneRow.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/CommonForm/CategoryFunctionForWinRow.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/CommonForm/CompleteButton.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/CommonForm/CommonFormResouce.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/CommonForm/SelectedStatuButton.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/CommonForm/SceneTargetTimeRow.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/CommonForm/RowLayoutEditButton.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/CommonForm/CustomAlert.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/CommonForm/LeftIconButtonRow.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/CommonForm/BackButton.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/CommonForm/DeviceIconSelectedIMGByLocal.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/CommonForm/SelectSceneStatuRow.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/CommonForm/SceneMainView.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/CommonForm/SelectDeviceWithSeekBarRow.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/CommonForm/FunctionButton.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/CommonForm/FunctionIconButton.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/CommonForm/ACLeftIconButtonRowLayout.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/CommonForm/ButtonLineForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/CommonForm/SelectZone.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/CommonForm/SelectDeviceWithPickViewRow.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/CommonForm/DeviceInfoEditRow.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/CommonForm/DeviceDetailInfo.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/CommonForm/CommonEnum.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/CommonForm/RowLayoutDeleteButton.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/CommonForm/FunctionMainView.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/CommonForm/SelectSceneRow.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/CommonForm/RoomMainView.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/CommonForm/CategoryFunctionRow.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/CommonForm/SceneTargetFunctionRow.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Light/AirSwitchControl.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Light/OnOffControl.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Light/LightControl.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Light/PlugControl.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Light/DimmableLightControl.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Account/AccountForgetPWD.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Account/AccountRegister.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Account/PhoneZone.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Account/AccountRegisterSuccess.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Account/AccountLoginByCode.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Account/AccountResetPWDSuccess.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Account/PhoneEmailForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Account/AccountLogin.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserView/LoginLoading.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/CommonForm/SceneCategoryView.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/DeviceLogic/ReadDeviceAttributeLogic.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/DLL/MQTTnet.dll","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/DLL/Security.dll","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/DLL/Elian.iOS.dll","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/DLL/ZigBee.Droid.dll","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/DLL/Shared.Droid.dll","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/DLL/Newtonsoft.Json.dll","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/DLL/ZigBee.Ios.xml","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/DLL/ZigBee.Droid.xml","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/DLL/M2Mqtt.Net.dll","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/packages/Xamarin.Android.Support.Core.UI.25.4.0.1/proguard/proguard.txt"],"BuildActions":["Compile","Compile","Compile","None","None","None","None","AndroidResource","AndroidResource","AndroidResource","AndroidNativeLibrary","AndroidNativeLibrary","AndroidResource","AndroidResource","AndroidResource","AndroidResource","AndroidResource","AndroidResource","AndroidResource","AndroidResource","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","ProjectReference","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","None","None","None","None","None","None","None","None","None","ProguardConfiguration"],"Analyzers":[]} |
| | | {"Format":1,"ProjectReferences":[],"MetadataReferences":[{"FilePath":"/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/packages/BouncyCastle.Crypto.dll.1.8.1/lib/BouncyCastle.Crypto.dll","Aliases":[]},{"FilePath":"/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/DroidLib/bin/Debug/DroidLib.dll","Aliases":[]},{"FilePath":"/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/packages/FastAndroidCamera.2.0.0/lib/MonoAndroid403/FastAndroidCamera.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Java.Interop.dll","Aliases":[]},{"FilePath":"/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/DLL/M2Mqtt.Net.dll","Aliases":[]},{"FilePath":"/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/packages/Microsoft.AppCenter.Analytics.1.14.0/lib/MonoAndroid403/Microsoft.AppCenter.Analytics.Android.Bindings.dll","Aliases":[]},{"FilePath":"/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/packages/Microsoft.AppCenter.Analytics.1.14.0/lib/MonoAndroid403/Microsoft.AppCenter.Analytics.dll","Aliases":[]},{"FilePath":"/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/packages/Microsoft.AppCenter.1.14.0/lib/MonoAndroid403/Microsoft.AppCenter.Android.Bindings.dll","Aliases":[]},{"FilePath":"/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/packages/Microsoft.AppCenter.Crashes.1.14.0/lib/MonoAndroid403/Microsoft.AppCenter.Crashes.Android.Bindings.dll","Aliases":[]},{"FilePath":"/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/packages/Microsoft.AppCenter.Crashes.1.14.0/lib/MonoAndroid403/Microsoft.AppCenter.Crashes.dll","Aliases":[]},{"FilePath":"/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/packages/Microsoft.AppCenter.1.14.0/lib/MonoAndroid403/Microsoft.AppCenter.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v8.0/Mono.Android.dll","Aliases":[]},{"FilePath":"/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/packages/MQTTnet.2.4.0/lib/netstandard1.3/MQTTnet.Core.dll","Aliases":[]},{"FilePath":"/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/packages/MQTTnet.2.4.0/lib/netstandard1.3/MQTTnet.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/mscorlib.dll","Aliases":[]},{"FilePath":"/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/DLL/Newtonsoft.Json.dll","Aliases":[]},{"FilePath":"/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/DLL/Security.dll","Aliases":[]},{"FilePath":"/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/DLL/Android/Shared.Droid.dll","Aliases":[]},{"FilePath":"/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/DLL/Android/Shared.Droid.HDLWidget.dll","Aliases":[]},{"FilePath":"/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/DLL/Android/Shared.Droid.Smartrefresh.dll","Aliases":[]},{"FilePath":"/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/DLL/Android/Shared.Droid.TouchID.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/System.Core.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/System.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/System.IO.Compression.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/System.Net.Http.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Runtime.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/System.Web.Services.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/System.Xml.dll","Aliases":[]},{"FilePath":"/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/DLL/Android/Xamarin.Android.Arch.Core.Common.dll","Aliases":[]},{"FilePath":"/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/DLL/Android/Xamarin.Android.Arch.Lifecycle.Common.dll","Aliases":[]},{"FilePath":"/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/DLL/Android/Xamarin.Android.Arch.Lifecycle.Runtime.dll","Aliases":[]},{"FilePath":"/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/DLL/Android/Xamarin.Android.Support.Animated.Vector.Drawable.dll","Aliases":[]},{"FilePath":"/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/DLL/Android/Xamarin.Android.Support.Annotations.dll","Aliases":[]},{"FilePath":"/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/DLL/Android/Xamarin.Android.Support.Compat.dll","Aliases":[]},{"FilePath":"/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/DLL/Android/Xamarin.Android.Support.Core.UI.dll","Aliases":[]},{"FilePath":"/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/DLL/Android/Xamarin.Android.Support.Core.Utils.dll","Aliases":[]},{"FilePath":"/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/DLL/Android/Xamarin.Android.Support.Fragment.dll","Aliases":[]},{"FilePath":"/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/DLL/Android/Xamarin.Android.Support.Media.Compat.dll","Aliases":[]},{"FilePath":"/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/DLL/Android/Xamarin.Android.Support.v4.dll","Aliases":[]},{"FilePath":"/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/DLL/Android/Xamarin.Android.Support.v7.AppCompat.dll","Aliases":[]},{"FilePath":"/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/DLL/Android/Xamarin.Android.Support.v7.RecyclerView.dll","Aliases":[]},{"FilePath":"/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/DLL/Android/Xamarin.Android.Support.Vector.Drawable.dll","Aliases":[]},{"FilePath":"/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/packages/ZXing.Net.Mobile.2.4.1/lib/MonoAndroid71/ZXing.Net.Mobile.Core.dll","Aliases":[]},{"FilePath":"/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/packages/ZXing.Net.Mobile.2.4.1/lib/MonoAndroid71/zxing.portable.dll","Aliases":[]},{"FilePath":"/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/packages/ZXing.Net.Mobile.2.4.1/lib/MonoAndroid71/ZXingNetMobile.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Diagnostics.Contracts.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Diagnostics.FileVersionInfo.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Net.Security.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Xml.XPath.XDocument.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Net.WebSockets.Client.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.IO.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Dynamic.Runtime.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Runtime.Serialization.Xml.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Security.Principal.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Reflection.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Threading.ThreadPool.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Security.Cryptography.Cng.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.ComponentModel.EventBasedAsync.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Security.Cryptography.Encryption.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Runtime.CompilerServices.VisualC.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Threading.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Security.Cryptography.DeriveBytes.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/netstandard.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.IO.UnmanagedMemoryStream.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.ServiceModel.Http.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.IO.FileSystem.AccessControl.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Xml.XPath.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Xml.XmlDocument.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Xml.Xsl.Primitives.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Resources.Writer.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Console.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Net.Cache.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Net.Sockets.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Text.Encoding.Extensions.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Net.NetworkInformation.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Net.Utilities.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Security.Principal.Windows.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Security.Claims.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.ServiceModel.Primitives.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Security.Cryptography.Hashing.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.ComponentModel.Primitives.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.IO.FileSystem.DriveInfo.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Security.Cryptography.X509Certificates.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Reflection.Primitives.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Runtime.Numerics.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.IO.FileSystem.Watcher.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Diagnostics.TraceSource.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Reflection.Emit.Lightweight.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Text.Encoding.CodePages.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Linq.Expressions.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Threading.Timer.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Runtime.InteropServices.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.IO.Pipes.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Net.HttpListener.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Text.RegularExpressions.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Threading.Tasks.Parallel.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Collections.NonGeneric.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Collections.Concurrent.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Threading.Overlapped.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Security.Cryptography.Pkcs.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Runtime.Handles.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Data.SqlClient.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.ObjectModel.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Net.WebHeaderCollection.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Runtime.InteropServices.RuntimeInformation.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.ComponentModel.TypeConverter.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Net.Mail.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Threading.Tasks.Extensions.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Linq.Parallel.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Xml.XDocument.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Security.SecureString.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/Microsoft.Win32.Registry.AccessControl.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Security.Cryptography.RSA.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.ComponentModel.Annotations.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.IO.FileSystem.Primitives.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Security.Cryptography.Primitives.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.IO.Compression.ZipFile.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Runtime.InteropServices.WindowsRuntime.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Linq.Queryable.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Resources.ResourceManager.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Resources.Reader.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Collections.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Reflection.Emit.ILGeneration.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Data.Common.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Net.NameResolution.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.ComponentModel.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.ServiceProcess.ServiceController.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Security.Cryptography.Encryption.ECDiffieHellman.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Runtime.Loader.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.ServiceModel.Security.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Net.AuthenticationManager.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Xml.ReaderWriter.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Threading.Tasks.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Diagnostics.Tracing.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.AppContext.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Buffers.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Security.Cryptography.Encryption.ECDsa.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Security.Cryptography.Csp.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Diagnostics.TextWriterTraceListener.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Text.Encoding.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.IO.MemoryMappedFiles.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Security.Cryptography.OpenSsl.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/Microsoft.Win32.Registry.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Globalization.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Security.Cryptography.RandomNumberGenerator.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Collections.Specialized.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Security.Cryptography.ProtectedData.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.ValueTuple.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Xml.XPath.XmlDocument.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Net.ServicePoint.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Xml.XmlSerializer.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Reflection.Extensions.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Globalization.Extensions.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Runtime.Extensions.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Resources.ReaderWriter.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Security.Cryptography.Encoding.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.IO.IsolatedStorage.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Threading.AccessControl.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.ServiceModel.NetTcp.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Security.AccessControl.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Reflection.TypeExtensions.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Globalization.Calendars.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Net.Requests.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Net.WebSockets.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Reflection.Emit.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.IO.FileSystem.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Runtime.Serialization.Json.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Security.Cryptography.Algorithms.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Threading.Thread.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Linq.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Diagnostics.Process.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Diagnostics.Tools.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Security.Cryptography.Hashing.Algorithms.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Diagnostics.Debug.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/Microsoft.Win32.Primitives.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Runtime.Serialization.Primitives.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Diagnostics.TraceEvent.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Drawing.Primitives.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Runtime.Serialization.Formatters.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Net.Ping.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.ServiceModel.Duplex.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Diagnostics.StackTrace.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Reflection.DispatchProxy.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Security.Cryptography.Encryption.Aes.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Memory.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Net.Primitives.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Drawing.Common.dll","Aliases":[]}],"Files":["/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Application.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Resources/Resource.designer.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Properties/AssemblyInfo.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/app.config","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/packages.config","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Resources/AboutResources.txt","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Properties/AndroidManifest.xml","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Resources/layout/Main.axml","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Resources/values/Strings.xml","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Resources/values/Styles.xml","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/libs/armeabi-v7a/libelianjni.so","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/libs/armeabi-v7a/libjcore127.so","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Resources/drawable/Loading.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Resources/mipmap-xxhdpi/Icon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Resources/mipmap-mdpi/Icon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Resources/mipmap-hdpi/Icon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Resources/mipmap-xhdpi/Icon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Resources/mipmap-xxxhdpi/Icon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Resources/drawable/Icon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Resources/xml/file_paths.xml","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Language.ini","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Account/Account.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Account/Cancle.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Account/Cat.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Account/ChangeSuccess.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Account/Code.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Account/HidePwd.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Account/Logo_loginBG.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Account/Logo_White.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Account/Password.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Account/PhoneEmail_White.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Account/UnhidePwd.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/AC/Add.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/AC/Fan_Height.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/AC/Fan_HeightSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/AC/Fan_Low.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/AC/Fan_LowSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/AC/Fan_Middle.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/AC/Fan_MiddleSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/AC/Group.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/AC/Mode_Auto.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/AC/Mode_AutoSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/AC/Mode_Cool.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/AC/Mode_CoolSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/AC/Mode_Dry.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/AC/Mode_DrySelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/AC/Mode_Fan.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/AC/Mode_FanSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/AC/Mode_Heat.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/AC/Mode_HeatSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/AC/OpenOrClose.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/AC/OpenOrCloseSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/AC/Path.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/AC/Reduce.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/AC/SelectedFanModeBG.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/AC/SelectedModeBG.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/BindPic/BindAdd.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/BindPic/BindDown.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/BindPic/BindEmptyPic.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/BindPic/BindLeft.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/BindPic/BindRight.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Center/Abount.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Center/Admin.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Center/Backup.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Center/DeviceManagement.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Center/ImperialCrown.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Center/MenberManagement.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Center/Opinion.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Center/ResidenceManagement.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Center/SafetyManagement.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Device/AirConditioner.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Device/AirConditionerEpoint.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Device/AirConditionerZbGateway.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Device/AirSwitch.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Device/AirSwitchCloudContr.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Device/ButtonPanel.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Device/ButtonPanelFour.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Device/ButtonPanelOne.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Device/ButtonPanelThree.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Device/ButtonPanelTwo.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Device/ColorLight.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Device/Converter.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Device/ConverterZb485.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Device/Curtain.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Device/CurtainAutoOpen.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Device/CurtainSiphonate.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Device/DimmableLight.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Device/DimmableLightOneLoad.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Device/DryContact.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Device/IntelligentLocks.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Device/IntelligentLocksH06C.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Device/Light.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Device/PanelTable.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Device/Relay.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Device/RelayEpoint.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Device/RelayThreeLoad.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Device/Repeater.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Device/Sensor.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Device/SensorCarbonMonoxide.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Device/SensorDoorWindow.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Device/SensorEmergencyButton.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Device/SensorFire.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Device/SensorHumidity.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Device/SensorInfrared.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Device/SensorMotion.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Device/SensorPir.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Device/SensorTemperature.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Device/SensorWater.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Device/Socket1.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Device/Switch.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/DoorLock/AddFailedPic.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/DoorLock/AddFingerprintTipPic.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/DoorLock/AddIcCardTipPic.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/DoorLock/AddIcon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/DoorLock/AddPasswordTicPic.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/DoorLock/AllMethod.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/DoorLock/AllMethodIcon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/DoorLock/AllMethodOn.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/DoorLock/CancelIcon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/DoorLock/DateIcon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/DoorLock/DelIcon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/DoorLock/DistributeUnlockIcon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/DoorLock/DooorLockPicOpen.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/DoorLock/DoorLockClose.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/DoorLock/DoorlockIcon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/DoorLock/DoorLockOpen.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/DoorLock/DoorLockPicClose.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/DoorLock/DoorlockPicture.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/DoorLock/DoorLockUserPic.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/DoorLock/EntrySuccessIcon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/DoorLock/FavoriteIcon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/DoorLock/Fingerprint.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/DoorLock/Fingerprint207.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/DoorLock/FingerprintOn.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/DoorLock/Left.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/DoorLock/MemberIcon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/DoorLock/Password.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/DoorLock/PasswordOn.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/DoorLock/proximityCard.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/DoorLock/proximityCardOn.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/DoorLock/RecordIcon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/DoorLock/RemoteUnlockIcon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/DoorLock/RightIcon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/DoorLock/RoomPic.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/DoorLock/SelectedIcon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/DoorLock/SettingIcon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/DoorLock/ShareIcon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/DoorLock/SideslipPic.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/DoorLock/Switch.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/DoorLock/SwitchOn.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/DoorLock/TemPasswordVisiable.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/DoorLock/TempPasswordBackground.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/DoorLock/TempPasswordBackground1.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/DoorLock/TypeIcon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/DoorLock/UndistributeIcon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/DoorLock/UnLockBlankPic.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/DoorLock/UnLockButton.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/DoorLock/UnlockFailed.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/DoorLock/UnLockSideslipIcon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/DoorLock/UnlockSuccess.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/DoorLock/UnselectedIcon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/DoorLock/VisitorIcon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Floor/Floor.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Floor/FloorSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/FunctionIcon/10Icon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/FunctionIcon/10IconSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/FunctionIcon/11Icon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/FunctionIcon/11IconSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/FunctionIcon/12Icon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/FunctionIcon/12IconSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/FunctionIcon/13Icon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/FunctionIcon/13IconSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/FunctionIcon/14Icon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/FunctionIcon/14IconSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/FunctionIcon/15Icon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/FunctionIcon/15IconSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/FunctionIcon/16Icon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/FunctionIcon/16IconSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/FunctionIcon/17Icon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/FunctionIcon/17IconSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/FunctionIcon/18Icon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/FunctionIcon/18IconSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/FunctionIcon/19Icon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/FunctionIcon/19IconSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/FunctionIcon/1Icon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/FunctionIcon/1IconSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/FunctionIcon/20Icon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/FunctionIcon/20IconSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/FunctionIcon/2Icon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/FunctionIcon/2IconSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/FunctionIcon/3Icon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/FunctionIcon/3IconSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/FunctionIcon/4Icon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/FunctionIcon/4IconSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/FunctionIcon/5Icon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/FunctionIcon/5IconSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/FunctionIcon/6Icon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/FunctionIcon/6IconSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/FunctionIcon/7Icon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/FunctionIcon/7IconSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/FunctionIcon/8Icon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/FunctionIcon/8IconSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/FunctionIcon/9Icon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/FunctionIcon/9IconSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Gateway/GatewayIcon1.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Gateway/GatewayIcon6.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Gateway/RealGateway1.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Gateway/RealGateway6.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Gateway/WiredGateway.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Gateway/WiredGatewayInstruct.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Instruct/DeviceSearch.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Instruct/DimmableLightOneLoad.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Instruct/IntelligentLocksH06C.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Instruct/PanelFourButton.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Instruct/PanelThreeButton.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Instruct/PanelTwoButton.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Instruct/RelayThreeLoad.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/Add.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/Add_Category.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/Add_GW.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/Back.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/BottomShadow.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/CancelIcon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/Category_FunctionBG.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/Category_FunctionBGSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/Check.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/CloseIcon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/Collection.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/Collection1.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/CollectionSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/CollectionSelected1.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/DateSearchIcon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/DeleteIcon1.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/DeleteIcon2.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/DeleteIcon2Selected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/Down.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/DownLoad.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/Drop_Down.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/FixedPosition.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/FixedPositionSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/Floor.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/ForgotPswList.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/FunctionCardView.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/FunctionCardViewSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/FunctionViewBG.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/GarrisonList.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/GarrisonListSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/HidenPWD.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/House.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/HouseSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/ItemSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/More.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/NewVersion.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/Next.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/NoBindGW.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/NoFunction.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/OpenIcon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/PersentIcon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/PickerColorWheel.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/Point.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/ProgressMsg.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/PswSettion.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/PswSettionSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/QRCode.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/Remote.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/ResidenceIcon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/RightIcon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/Room.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/RoomIcon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/SceneCard.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/SceneFunctionBG.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/ScreeningType.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/Search.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/SelectFloor_Left.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/SelectHouse.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/ShardMenu.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/Switch.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/Switch1.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/Switch2.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/Switch2Selected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/SwitchSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/SwitchSelected1.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/Time.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/Timer.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/Tips.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/UnHidenPWD.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/UnLockFail.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/UnLockSuccess.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/UpperTriangle.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/VirtualFrame.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/WrongIcon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Logo/Logo.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Navigation/Category.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Navigation/CategorySelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Navigation/Home.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Navigation/HomeSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Navigation/Setting.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Navigation/SettingSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/RealDevice/AirSwitchCloudContr.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/RealDevice/CommonDevice.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/RealDevice/CurtainAutoOpen.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/RealDevice/CurtainSiphonate.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/RealDevice/ButtonPanelFour.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/RealDevice/ButtonPanelFourNotPower.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/RealDevice/ButtonPanelThree.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/RealDevice/ButtonPanelTwo.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/RealDevice/SensorCarbonMonoxide.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/RealDevice/SensorDoorWindow.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/RealDevice/SensorEmergencyButton.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/RealDevice/SensorFire.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/RealDevice/SensorInfrared.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/RealDevice/SensorMotion.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/RealDevice/SensorPir.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/RealDevice/SensorWater.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Room/RoomCardView.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Room/RoomCardView_Name.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Room/Room_Rectangle.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Safeguard/ProtectionAtHome.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Safeguard/ProtectionAtHomeSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Safeguard/ProtectionRemoveHome.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Safeguard/ProtectionRemoveHomeSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Safeguard/WithdrawGarrison.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Safeguard/WithdrawGarrisonSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Account/Back.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Scene/Delaying.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/AC/AC_TIP.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/RoomIcon/0.JPG","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/RoomIcon/1.JPG","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/RoomIcon/2.JPG","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/RoomIcon/3.JPG","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/RoomIcon/4.JPG","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/RoomIcon/5.JPG","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/SceneIcon/0.jpg","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/SceneIcon/1.jpg","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/SceneIcon/2.jpg","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/SceneIcon/3.jpg","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/SceneIcon/4.jpg","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/SceneIcon/5.jpg","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/SceneIcon/6.jpg","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/SceneIcon/7.jpg","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/SceneIcon/8.jpg","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/SceneIcon/9.jpg","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Room/List.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Room/Humidity.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Room/Temperature.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/InputAccountIcon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/InputAccountIconSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/MemberNotEsixtPic.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/NotAuthority.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/NotShardPic.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/ScanQRcodeIcon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/ScanQRcodeIconSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/1.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/2.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/3.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/ac.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/add.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/AddSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/airswitch.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/athome.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/back.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/connect.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/curtain.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/Ddmmablelight.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/delay.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/delay1.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/deviceselectedbackgroundcolor.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/deviceunselectedbackgroundcolor.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/dimmableLight.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/doorlock.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/drop-down.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/dropdown.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/function.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/function1.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/humidity.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/iconBackgroundColor.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/iconSelectedBackgroundColor.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/leavehome.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/light.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/light_1.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/logicaddcolor.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/logicbj1.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/logicbj2.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/logicclose.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/logicopen.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/next.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/nodelay.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/nofunction.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/noon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/noscene.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/nosecurity.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/panel.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/point.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/position.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/scene.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/scene1.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/security.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/security1.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/selected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/selectedac.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/selectedairswitch.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/selectedcurtain.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/selecteddimmableLight.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/selecteddoorlock.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/selectedlight.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/selectedmonth.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/selectedpanel.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/selectedsenor.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/selectedsensor13.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/selectedsensor21.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/selectedsensor22.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/selectedsensor277.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/selectedsensor40.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/selectedsensor42.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/selectedsensor43.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/selectedsensor44.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/sensor13.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/sensor21.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/sensor22.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/sensor277.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/sensor40.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/sensor42.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/sensor43.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/sensor44.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/sign.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/sunrise.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/sunset.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/temperature.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/time.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/timeparagraph.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/timepoint.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/withdrawal.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/ItemUnSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Gateway/WiredGatewaySearching.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/BottomButtonGround.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/FailIcon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Light/DeskLamp.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Light/DeskLampSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/Message.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/MessageSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/MyHome.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/NextSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/SelectFloor_Right.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/Shared.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/RoomIconBackground.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/RoomIconBackgroundSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Room/FavoriteRoom.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Room/ItemSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Room/ItemUnSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Room/ItemUnSelected_Black.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Room/NoNameRoom.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/DoorLock/DelBackground.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/DoorLock/TemPasswordInvisiable.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/GwSwitchIcon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/GwSwitchIconSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Instruct/CurtainAutoOpen.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/DeviceLimitGround.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/DownTriangle.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/UpTriangle.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/DeviceLimitGroundSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Instruct/CurtainSiphonate.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Instruct/SensorInfrared.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Instruct/SensorDoorWindow.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Instruct/SensorCarbonMonoxide.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Instruct/SensorWater.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Instruct/AirSwitchCloudContr.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Instruct/RepeaterZigbee.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Instruct/AirConditionerZbGateway.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Device/RepeaterZigbee.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Instruct/SensorFire.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/lockadd.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/selectedhumidity.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/ZigeeLogic/selectedtemperature.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/CreatFloor.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/CreatFloorSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/RoomIconSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Device/AirConditionerEpointSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/WarningIcon1.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/AC/Mode_Cool2.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/AC/Mode_Dry2.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/AC/Mode_Fan2.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/AC/Mode_Heat2.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/IndoorUnitGround.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/BindPic/BindRoomColor.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/BindPic/BindRoomColorOn.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Scene/SceneIcon.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Scene/Selected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Safeguard/SafetyShortcut.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Safeguard/SafetyShortcutSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Device/ThirdPartyDevice.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Account/QQ.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Account/Wechat.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/HadAuthority.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Safeguard/SafeguardPasswordGround.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Item/PhoneBook.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/RollerShade/Close.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/RollerShade/CloseSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/RollerShade/Down.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/RollerShade/DownSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/RollerShade/Open.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/RollerShade/OpenSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/RollerShade/Stop.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/RollerShade/StopSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/RollerShade/Up.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/RollerShade/UpSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Gateway/AddGatewaySuccess.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Gateway/WirelessGatewaySearching.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/DroidLib/DroidLib.csproj","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Light/OFF.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Light/OFFSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Light/ON.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Light/OnOff.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Light/ONSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Light/Plug.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Light/PlugSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Gateway/WirelessApDirection.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Gateway/WirelessApGatewaySearching.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Gateway/WirelessGateway.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Loading/1.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Loading/10.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Loading/11.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Loading/12.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Loading/13.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Loading/14.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Loading/15.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Loading/16.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Loading/17.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Loading/18.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Loading/19.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Loading/2.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Loading/20.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Loading/21.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Loading/22.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Loading/23.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Loading/24.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Loading/25.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Loading/26.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Loading/27.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Loading/28.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Loading/29.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Loading/3.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Loading/30.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Loading/31.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Loading/32.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Loading/4.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Loading/5.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Loading/6.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Loading/7.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Loading/8.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/Loading/9.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/AC/Swing_1.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/AC/Swing_1Selected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/AC/Swing_2.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/AC/Swing_2Selected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/AC/Swing_3.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/AC/Swing_3Selected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/AC/Swing_4.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/AC/Swing_4Selected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/AC/Swing_5.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/AC/Swing_5Selected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/AC/Swing_Auto.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/AC/Swing_AutoSelected.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/GateWay.Droid/Assets/Phone/AC/SwingBackground.png","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Common/ComparerDeviceUI.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Common/Device.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Common/House.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Common/Logic.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Common/ResponseEntity/ApkInfoOBJ.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Common/ResponseEntity/FirmwareManaRes.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Common/ResponseEntity/GetAppVersionCode.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Common/ResponseEntity/ResultPack.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Common/ResponseEntity/UserLoginLocalRegionRes.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Pad/MainPage.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/R.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Common/ZigbeeColor.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Common/CommonPage.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Common/ResultStatus.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Common/ResponseEntity/BackupInfoRes.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Common/ResponseEntity/FolderRes.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Common/ResponseEntity/GatewayRes.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Common/ResponseEntity/GetAreaCode.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Common/ResponseEntity/ResidenceRes.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Common/ResponseEntity/ResponsePack.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Common/ResponseEntity/UserLoginRes.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Common/ResponseEntity/UserRegisterReqDto.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Common/SendDataToServer.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Common/Room.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Common/DeviceUI.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Common/SceneUI.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Common/SceneTargetDeviceUI.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Common/SceneRoomUI.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Common/ResponseEntity/AuthUserRes.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserView/UserPage.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserView/HomePage.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserView/UserHomeView.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/HdlBackup/HdlBackupListForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/HdlBackup/HdlGatewayBackUpForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/HdlBackup/HdlGatewayListBackUpForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Residence/LookRoomDeviceListForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Residence/FloorListRoomForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Residence/LookRoomSettionForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Residence/ResidenceListForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Residence/AddNewRoomForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Residence/EditorRoomInforForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Residence/ResidenceManagementForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Password/CheckOldPhoneForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Password/EditorGesturePasswordForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Password/ForgotSecondaryPasswordForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Password/CheckNewPhoneForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Password/ResetAccountPasswordForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Password/CheckOldEmailForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Password/EditorAccountPasswordForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Password/ForgotAccountPasswordForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Password/CheckNewEmailForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Password/EditorSecondaryPasswordForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Suggestion/FeedbackForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Member/AddMemberSuccessForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Member/AddMemberByIdForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Member/MemberNotEsixtForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Member/AddMemberInfoForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Member/MemberManagementForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Member/SubAccountLevelUpSuccessForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Member/MemberListForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/SharedContent/LookSharedContentForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/SharedContent/LookSharedListRoomForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/SharedContent/AddNewSharedListRoomForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/SharedContent/AddNewSharedContentForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Safety/AlarmTargetAddMenuForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Safety/GarrisonAreaSettionMenuForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Safety/GarrisonAreaDelayedSettionForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Safety/CoercePswEditorForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Safety/PasswordListUserForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Safety/AlarmTargetStatuSelectSwitchForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Safety/GarrisonAreaListMenuForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Safety/AlarmTargetExistSettionForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Safety/SafetyManagementMainForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Safety/PasswordAddNewForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Safety/AlarmTargetAddSceneForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Safety/CoercePswAddContactForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Safety/GarrisonAreaExistSensorForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Safety/PasswordMenuForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Safety/AlarmTargetAddDeviceForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Safety/AlarmTargetStatuSelectLightForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Safety/CoercePswAddNewForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Safety/AlarmTargetStatuSelectCurtainForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Safety/PasswordUserEditorForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/OtherParty/OtherPartyAccountMenuForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/DoorLock/UndistributeDoorlockUserPage.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/DoorLock/HistoryRecordPage.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/DoorLock/MemberManagement.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/DoorLock/EntryStatusPage.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/DoorLock/MemberFrozenPage.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/DoorLock/DoorLockCommonLayout.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/DoorLock/FunctionSetting.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/DoorLock/AddUnLockMethodTip.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/DoorLock/FunctionSettingSub.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/DoorLock/MasterManagementPage.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/DoorLock/UnLockMethod.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/DoorLock/TimeSettignPage.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/DoorLock/DoorlockDialog.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/DoorLock/UserDoorLockPage.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/DoorLock/UserManagement.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/DoorLock/AddUnLockMethod.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/DoorLock/TemporaryPassword.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/DoorLock/DoorLockCommonInfo.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Abount/AbountForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Device/DeviceAddSuccessForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Device/DeviceFirmwareUpdateForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Device/DeviceFunctionSettionForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Device/DeviceGeneralInformationForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Device/DeviceSearchForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Device/DeviceHistoryFirmwareVersionForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Device/DeviceDryContactSettionForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Device/DeviceFirmwareInfoForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Device/DeviceMacInfoEditorForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Device/DeviceListMainForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Device/Panel/PanelFunctionSettionForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Device/Panel/PanelButtonSettionForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Device/Panel/PanelBackLightSettionForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Device/Panel/PanelColorSelectForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Device/Curtain/AutoOpenDirectionAndLimitSettionForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Device/Curtain/SiphonateDirectionAndLimitSettionForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Device/PirSensor/PirSensorTargetSelectForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Device/PirSensor/PirSensorBindTargetSettionForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Device/DoorLock/DoorLockScreeningTypeForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Device/DoorLock/DoorLockHistoryLogForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Device/AirConditioner/IndoorUnitSettionForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Device/AirConditioner/AirConditionerModeForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Device/AirConditioner/IndoorUnitListForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Device/Direction/CurtainSiphonateDirectionForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Device/Direction/RelayThreeLoadDirectionForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Device/Direction/DimmableLightOneLoadDirectionForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Device/Direction/RepeaterZigbeeDirectionForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Device/Direction/SensorPirDirectionForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Device/Direction/AirConditionerZbGatewayDirectionForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Device/Direction/IntelligentLocksH06cDirectionForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Device/Direction/PanelThreeButtonDirectionForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Device/Direction/SensorWaterDirectionForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Device/Direction/SensorDoorWindowDirectionForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Device/Direction/AirSwitchCloudContrDirectionForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Device/Direction/AddDeviceTypeListForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Device/Direction/SensorInfraredDirectionForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Device/Direction/SensorCarbonMonoxideDirectionForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Device/Direction/PanelFourButtonDirectionForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Device/Direction/CurtainAutoOpenDirectionForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Device/Direction/PanelTwoButtonDirectionForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Device/Direction/SensorFireDirectionForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Device/Direction/CommonForm/DirectionCommonForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Device/Direction/Help/DeviceDirectionHelpForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Device/Relay/RelayThreeLoadBackLightSettionForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Device/Bind/AddScenePage.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Device/Bind/AddDevicePage.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Device/Bind/ChooseKeyModePage.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Device/Bind/BindTargetsPage.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Device/Bind/BindCommonLayout.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Device/Bind/BindInfo.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/UserMain/QRCodeForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/UserMain/UserInformationForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/UserMain/SecondAuthenticationForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/UserMain/UserMainForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Resourse/ControlCommonResourse.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Resourse/UserCenterResourse.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Resourse/GatewayResourse.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Resourse/FirmwareUpdateResourse.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Resourse/DirectoryFileNameResourse.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Form/PswSecondarySecurityForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Form/NumberPswInputDialogForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Form/BottomMenuSelectForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Form/SelectDeviceForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Form/PswGestureSecirityForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Form/BottomItemSelectForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Form/AreaCodeSelectForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Form/DialogInputForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Form/Base/CommonFormBase.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Form/Base/EditorCommonForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Form/Base/DialogCommonForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Logic/HdlSafeguardLogic.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Logic/HdlBackupLogic.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Logic/HdlFirmwareUpdateLogic.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Logic/HdlThreadLogic.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Logic/HdlDeviceUpdateLogic.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Logic/UserCenterLogic.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Logic/HdlAlarmsLogic.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Logic/HdlDeviceAttributeLogic.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Logic/HdlDeviceHardInfoLogic.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Logic/HdlGatewayReceiveLogic.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Logic/HdlShardLogic.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Logic/HdlLogLogic.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Logic/HdlDeviceImageInfoLogic.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Logic/HdlGatewayBackupLogic.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Logic/HdlDeviceCurtainLogic.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Logic/HdlWifiLogic.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Logic/HdlJiguangMsgPushLogic.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Logic/HdlAutoBackupLogic.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Logic/HdlDeviceBindLogic.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Logic/HdlDevicePirSensorLogic.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Logic/HdlCheckLogic.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Logic/HdlDeviceFixedAttributeLogic.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Logic/HdlGatewayUpdateLogic.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Logic/HdlDevicePanelLogic.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Logic/HdlDeviceAirConditionerLogic.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Logic/HdlGatewayLogic.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Common/IMessageCommon.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Common/UserCenterCommon.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Common/GatewayBackupEnum.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Common/UserCenterColor.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Common/UserCenterEnumCommon.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Common/AccountOption.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Controls/NormalControls/PicViewControl.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Controls/NormalControls/NormalViewControl.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Controls/NormalControls/BackViewControl.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Controls/NormalControls/IconViewControl.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Controls/NormalControls/InformationTipView.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Controls/NormalControls/MostRightIconControl.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Controls/NormalControls/DetailTitleControl.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Controls/NormalControls/TopLayoutTitleControl.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Controls/NormalControls/DateSelectControl.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Controls/NormalControls/LoadingControl.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Controls/TextInputControls/TextInputControl.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Controls/TextInputControls/TextInputExControl.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Controls/FrameLayoutControls/FrameCaptionViewControl.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Controls/FrameLayoutControls/FrameRowControl.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Controls/FrameLayoutControls/FrameCaptionInputControl.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Controls/FrameLayoutControls/FrameLayoutControl.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Controls/FrameLayoutControls/FrameListControl.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Controls/SceneControls/SceneSimpleSelectControl.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Controls/SceneControls/SceneRoomControl.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Controls/DeviceControls/DeviceInfoIconControl.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Controls/DeviceControls/GatewayRowControl.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Controls/DeviceControls/DeviceSelectControl.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Controls/DeviceControls/DeviceObjectControl.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Controls/DeviceControls/DeviceRoomControl.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Controls/RowLayoutControls/RowNewVersionTipView.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Controls/RowLayoutControls/RowLayoutControl.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Controls/RowLayoutControls/RowMostRightTextView.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Controls/ListViewLayoutControls/VerticalListControl.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Controls/ListViewLayoutControls/VerticalFrameControl.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Controls/ClickButtonControls/BottomClickButton.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Controls/ClickButtonControls/NormalClickButton.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Controls/CompoundControls/SafeguardLogControl.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Controls/CompoundControls/TopRightMenuControl.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Controls/CompoundControls/RoomDeviceGroupMenuControl.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Controls/CompoundControls/PswGestureInputControl.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Controls/CompoundControls/NormalSelectControl.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Controls/CompoundControls/CutPictureControl.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Controls/CompoundControls/VerificationCodeControl.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Controls/CompoundControls/DeviceInformationListControl.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Controls/CompoundControls/ProgressFormBar.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Controls/CompoundControls/PswNumberInputControl.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Controls/CompoundControls/MsgControls.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Controls/CompoundControls/BelongAreaControl.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Controls/CompoundControls/InformationEditorControl.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Controls/CompoundControls/SceneFunctionSwitchControl.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Controls/CompoundControls/SearchEditText.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Controls/CompoundControls/SafetyMasterControl.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Controls/CompoundControls/ProgressBar.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Controls/CompoundControls/SafetySensorStatuControl.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Controls/BaseCommonControl/Common/IconControlCommon.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Controls/BaseCommonControl/Common/ClickButtonCommon.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Controls/BaseCommonControl/Base/TextInputBase.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Controls/BaseCommonControl/Base/ButtonBase.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Gateway/Update/GatewayFirmwareUpdateForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Gateway/Update/GatewayCoordinatorInfoForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Gateway/Update/GatewayVirtualDriveInfoForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Gateway/Update/GatewayFirmwareInfoForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Gateway/Update/GatewayHistoryFirmwareVersionForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Gateway/Update/GatewayLinuxInfoForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Gateway/Add/WirelessUdpSelectNetworkForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Gateway/Add/NewGateWayMenuSelectForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Gateway/Add/WirelessApSelectNetworkForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Gateway/Add/WirelessApDirection3Form.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Gateway/Add/WirelessUdpSearchForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Gateway/Add/WirelessApDirection1Form.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Gateway/Add/WiredGatewaySearchForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Gateway/Add/WiredGatewayDirectionForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Gateway/Add/WirelessApDirection2Form.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Gateway/Add/WirelessUdpDirectionForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Gateway/Add/WirelessApSearchForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Gateway/Manage/GatewayInfoEditorForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Gateway/Manage/GatewayAddSuccessForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Gateway/Manage/GatewayListForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Gateway/Manage/GatewayProductInfoForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Gateway/Manage/GatewaySearchListForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Gateway/Manage/GatewayGeneralInformationForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Gateway/Manage/GatewayBackUpListForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Gateway/Manage/GatewayRebindForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserCenter/Gateway/Manage/GatewayUploadAndDownLoadForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/ZigBee/IO/LocalFileUtils.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/ZigBee/Common/BigInteger.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/ZigBee/Common/OwnCodes.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/ZigBee/Common/Config.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/ZigBee/Common/Global.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/ZigBee/Common/CloudMqttResponsePack.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/ZigBee/Common/IStatus.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/ZigBee/Common/EncryptionService.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/ZigBee/Common/Application.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/ZigBee/Common/CommonInfo.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/ZigBee/Common/SendDataToGateway.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/ZigBee/Common/RemoteOperatorConsts.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/ZigBee/Common/SecuritySet.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/ZigBee/Device/ThirdPartyModuleUpgrade.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/ZigBee/Device/Safeguard.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/ZigBee/Device/LogicBase.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/ZigBee/Device/CommonDevice.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/ZigBee/Device/Scene.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/ZigBee/Device/Logic.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/ZigBee/Device/TemperatureSensor.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/ZigBee/Device/ZbGateway.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/ZigBee/Device/ZbGatewayData.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/ZigBee/Device/AC.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/ZigBee/Device/ThermostatObj.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/ZigBee/Device/Transverter.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/ZigBee/Device/Rollershade.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/ZigBee/Device/CurtainBase.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/ZigBee/Device/Repeater.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/ZigBee/Device/Enum.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/ZigBee/Device/BindObj.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/ZigBee/Device/AirSwitch.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/ZigBee/Device/Panel.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/ZigBee/Device/PIRSensor.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/ZigBee/Device/IASZone.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/ZigBee/Device/DeviceType.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/ZigBee/Device/DoorLock.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/ZigBee/Device/HDLbutton.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/ZigBee/Device/LigthtBase.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/ZigBee/Device/OTADevice.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/ZigBee/Device/ColorDimmableLight.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/ZigBee/Device/ToggleLight.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/ZigBee/Device/DimmableLight.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Room/UnallocatedRoom.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Room/EditRoom.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Room/RoomHumiditySetting.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Room/RoomManagement.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Room/AddRoomSelectPicByLocal.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Room/RoomTemperatureSetting.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Room/RoomShareSetting.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Room/RoomCommon.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/AC/ACControl.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/AC/ACControlBase.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Category/SelectDelayTime.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Category/CategorySceneSelectImgByLocal.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Category/SelectDevice.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Category/CategoryAddScene.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Category/SelectScene.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Category/SelectFloor.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Category/Category.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Curtain/RollerShadeControl.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Logic/Send.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Logic/EveryyearPage.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Logic/SelectedLogicState.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Logic/TemplatePage.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Logic/LogicMain.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Logic/SelectedLogicStatus.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Logic/AddScenePage.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Logic/LogicDevicePage.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Logic/SelectedLogic.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Logic/LogicCommunalPage.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Logic/MemberList.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Logic/Cycle.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Logic/TimePage.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Logic/EverymonthPage.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Logic/LogicIfon.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Logic/LogicListAutomation.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Logic/TemplateDeviceCondition.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Logic/DelayTime.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Logic/CyclicCycle.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Logic/AddLogicPage.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Logic/TimePoint.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Logic/DeviceStateCondition.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Logic/DeviceTarget.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Logic/LogicListPage.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Logic/TemplateDeviceAction.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Logic/IgnoreTime.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Logic/SelectedButton.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Logic/SecurityMode.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Logic/WeekPage.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Logic/CustomText.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Logic/DoorLockLogic/LockAddDevice.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Logic/DoorLockLogic/AddAction.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Logic/DoorLockLogic/LockLogicCommunalPage.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Logic/DoorLockLogic/LockAddScene.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Logic/DoorLockLogic/LockLogicList.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Logic/DoorLockLogic/AddCondition.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/CommonForm/SelectTime.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/CommonForm/Line.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/CommonForm/FunctionRow.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/CommonForm/SelectFunctionView.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/CommonForm/RoomNoNameMainView.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/CommonForm/DeviceInfoRow.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/CommonForm/TopFrameLayout.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/CommonForm/DeviceInfoWithZoneRow.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/CommonForm/CategoryFunctionForWinRow.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/CommonForm/CompleteButton.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/CommonForm/CommonFormResouce.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/CommonForm/SelectedStatuButton.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/CommonForm/SceneTargetTimeRow.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/CommonForm/RowLayoutEditButton.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/CommonForm/CustomAlert.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/CommonForm/LeftIconButtonRow.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/CommonForm/BackButton.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/CommonForm/DeviceIconSelectedIMGByLocal.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/CommonForm/SelectSceneStatuRow.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/CommonForm/SceneMainView.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/CommonForm/SelectDeviceWithSeekBarRow.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/CommonForm/FunctionButton.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/CommonForm/FunctionIconButton.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/CommonForm/ACLeftIconButtonRowLayout.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/CommonForm/ButtonLineForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/CommonForm/SelectZone.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/CommonForm/SelectDeviceWithPickViewRow.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/CommonForm/DeviceInfoEditRow.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/CommonForm/DeviceDetailInfo.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/CommonForm/CommonEnum.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/CommonForm/RowLayoutDeleteButton.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/CommonForm/FunctionMainView.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/CommonForm/SelectSceneRow.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/CommonForm/RoomMainView.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/CommonForm/CategoryFunctionRow.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/CommonForm/SceneTargetFunctionRow.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Light/AirSwitchControl.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Light/OnOffControl.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Light/LightControl.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Light/PlugControl.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Light/DimmableLightControl.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Account/AccountForgetPWD.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Account/AccountRegister.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Account/PhoneZone.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Account/AccountRegisterSuccess.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Account/AccountLoginByCode.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Account/AccountResetPWDSuccess.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Account/PhoneEmailForm.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/Account/AccountLogin.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/UserView/LoginLoading.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/CommonForm/SceneCategoryView.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/Phone/Device/DeviceLogic/ReadDeviceAttributeLogic.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/DLL/MQTTnet.dll","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/DLL/Security.dll","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/DLL/Elian.iOS.dll","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/DLL/ZigBee.Droid.dll","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/DLL/Shared.Droid.dll","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/DLL/Newtonsoft.Json.dll","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/DLL/ZigBee.Ios.xml","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/DLL/ZigBee.Droid.xml","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/DLL/M2Mqtt.Net.dll","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/packages/Xamarin.Android.Support.Core.UI.25.4.0.1/proguard/proguard.txt"],"BuildActions":["Compile","Compile","Compile","None","None","None","None","AndroidResource","AndroidResource","AndroidResource","AndroidNativeLibrary","AndroidNativeLibrary","AndroidResource","AndroidResource","AndroidResource","AndroidResource","AndroidResource","AndroidResource","AndroidResource","AndroidResource","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","ProjectReference","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","AndroidAsset","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","None","None","None","None","None","None","None","None","None","ProguardConfiguration"],"Analyzers":[]} |
| | |
| | | {"Format":1,"ProjectReferences":[],"MetadataReferences":[{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Java.Interop.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v8.0/Mono.Android.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/mscorlib.dll","Aliases":[]},{"FilePath":"/Users/BruceLee/Desktop/HomeApp/ZigbeeApp/Shared/DLL/Newtonsoft.Json.dll","Aliases":[]},{"FilePath":"/Users/BruceLee/Desktop/HomeApp/ZigbeeApp/Shared/DLL/Shared.Droid.HDLWidget.dll","Aliases":[]},{"FilePath":"/Users/BruceLee/Desktop/HomeApp/ZigbeeApp/Shared/DLL/Shared.Droid.PickerView.dll","Aliases":[]},{"FilePath":"/Users/BruceLee/Desktop/HomeApp/ZigbeeApp/Shared/DLL/Shared.Droid.TouchID.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/System.Core.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/System.Data.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/System.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Runtime.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/System.Web.Services.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/System.Xml.dll","Aliases":[]},{"FilePath":"/Users/BruceLee/Desktop/HomeApp/ZigbeeApp/packages/Xamarin.Android.Arch.Core.Common.1.1.1.3/lib/monoandroid80/Xamarin.Android.Arch.Core.Common.dll","Aliases":[]},{"FilePath":"/Users/BruceLee/Desktop/HomeApp/ZigbeeApp/packages/Xamarin.Android.Arch.Lifecycle.Common.1.1.1.3/lib/monoandroid80/Xamarin.Android.Arch.Lifecycle.Common.dll","Aliases":[]},{"FilePath":"/Users/BruceLee/Desktop/HomeApp/ZigbeeApp/packages/Xamarin.Android.Arch.Lifecycle.Runtime.1.1.1.3/lib/monoandroid80/Xamarin.Android.Arch.Lifecycle.Runtime.dll","Aliases":[]},{"FilePath":"/Users/BruceLee/Desktop/HomeApp/ZigbeeApp/packages/Xamarin.Android.Support.Annotations.28.0.0.3/lib/monoandroid80/Xamarin.Android.Support.Annotations.dll","Aliases":[]},{"FilePath":"/Users/BruceLee/Desktop/HomeApp/ZigbeeApp/packages/Xamarin.Android.Support.Compat.28.0.0.3/lib/monoandroid80/Xamarin.Android.Support.Compat.dll","Aliases":[]},{"FilePath":"/Users/BruceLee/Desktop/HomeApp/ZigbeeApp/packages/Xamarin.Android.Support.Core.UI.28.0.0.3/lib/monoandroid80/Xamarin.Android.Support.Core.UI.dll","Aliases":[]},{"FilePath":"/Users/BruceLee/Desktop/HomeApp/ZigbeeApp/packages/Xamarin.Android.Support.Core.Utils.28.0.0.3/lib/monoandroid80/Xamarin.Android.Support.Core.Utils.dll","Aliases":[]},{"FilePath":"/Users/BruceLee/Desktop/HomeApp/ZigbeeApp/packages/Xamarin.Android.Support.Fragment.28.0.0.3/lib/monoandroid80/Xamarin.Android.Support.Fragment.dll","Aliases":[]},{"FilePath":"/Users/BruceLee/Desktop/HomeApp/ZigbeeApp/packages/Xamarin.Android.Support.Media.Compat.28.0.0.3/lib/monoandroid80/Xamarin.Android.Support.Media.Compat.dll","Aliases":[]},{"FilePath":"/Users/BruceLee/Desktop/HomeApp/ZigbeeApp/packages/Xamarin.Android.Support.v4.28.0.0.3/lib/monoandroid80/Xamarin.Android.Support.v4.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/Microsoft.Win32.Primitives.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/Microsoft.Win32.Registry.AccessControl.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/Microsoft.Win32.Registry.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/netstandard.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.AppContext.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Buffers.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Collections.Concurrent.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Collections.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Collections.NonGeneric.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Collections.Specialized.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.ComponentModel.Annotations.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.ComponentModel.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.ComponentModel.EventBasedAsync.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.ComponentModel.Primitives.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.ComponentModel.TypeConverter.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Console.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Data.Common.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Data.SqlClient.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Diagnostics.Contracts.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Diagnostics.Debug.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Diagnostics.FileVersionInfo.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Diagnostics.Process.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Diagnostics.StackTrace.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Diagnostics.TextWriterTraceListener.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Diagnostics.Tools.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Diagnostics.TraceEvent.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Diagnostics.TraceSource.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Diagnostics.Tracing.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Drawing.Common.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Drawing.Primitives.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Dynamic.Runtime.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Globalization.Calendars.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Globalization.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Globalization.Extensions.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.IO.Compression.ZipFile.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.IO.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.IO.FileSystem.AccessControl.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.IO.FileSystem.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.IO.FileSystem.DriveInfo.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.IO.FileSystem.Primitives.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.IO.FileSystem.Watcher.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.IO.IsolatedStorage.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.IO.MemoryMappedFiles.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.IO.Pipes.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.IO.UnmanagedMemoryStream.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Linq.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Linq.Expressions.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Linq.Parallel.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Linq.Queryable.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Memory.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Net.AuthenticationManager.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Net.Cache.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Net.HttpListener.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Net.Mail.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Net.NameResolution.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Net.NetworkInformation.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Net.Ping.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Net.Primitives.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Net.Requests.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Net.Security.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Net.ServicePoint.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Net.Sockets.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Net.Utilities.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Net.WebHeaderCollection.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Net.WebSockets.Client.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Net.WebSockets.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.ObjectModel.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Reflection.DispatchProxy.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Reflection.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Reflection.Emit.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Reflection.Emit.ILGeneration.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Reflection.Emit.Lightweight.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Reflection.Extensions.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Reflection.Primitives.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Reflection.TypeExtensions.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Resources.Reader.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Resources.ReaderWriter.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Resources.ResourceManager.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Resources.Writer.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Runtime.CompilerServices.VisualC.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Runtime.Extensions.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Runtime.Handles.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Runtime.InteropServices.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Runtime.InteropServices.RuntimeInformation.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Runtime.InteropServices.WindowsRuntime.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Runtime.Loader.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Runtime.Numerics.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Runtime.Serialization.Formatters.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Runtime.Serialization.Json.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Runtime.Serialization.Primitives.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Runtime.Serialization.Xml.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Security.AccessControl.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Security.Claims.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Security.Cryptography.Algorithms.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Security.Cryptography.Cng.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Security.Cryptography.Csp.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Security.Cryptography.DeriveBytes.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Security.Cryptography.Encoding.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Security.Cryptography.Encryption.Aes.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Security.Cryptography.Encryption.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Security.Cryptography.Encryption.ECDiffieHellman.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Security.Cryptography.Encryption.ECDsa.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Security.Cryptography.Hashing.Algorithms.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Security.Cryptography.Hashing.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Security.Cryptography.OpenSsl.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Security.Cryptography.Pkcs.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Security.Cryptography.Primitives.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Security.Cryptography.ProtectedData.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Security.Cryptography.RandomNumberGenerator.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Security.Cryptography.RSA.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Security.Cryptography.X509Certificates.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Security.Principal.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Security.Principal.Windows.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Security.SecureString.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.ServiceModel.Duplex.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.ServiceModel.Http.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.ServiceModel.NetTcp.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.ServiceModel.Primitives.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.ServiceModel.Security.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.ServiceProcess.ServiceController.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Text.Encoding.CodePages.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Text.Encoding.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Text.Encoding.Extensions.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Text.RegularExpressions.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Threading.AccessControl.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Threading.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Threading.Overlapped.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Threading.Tasks.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Threading.Tasks.Extensions.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Threading.Tasks.Parallel.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Threading.Thread.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Threading.ThreadPool.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Threading.Timer.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.ValueTuple.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Xml.ReaderWriter.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Xml.XDocument.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Xml.XmlDocument.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Xml.XmlSerializer.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Xml.XPath.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Xml.XPath.XDocument.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Xml.XPath.XmlDocument.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Xml.Xsl.Primitives.dll","Aliases":[]}],"Files":["/Users/BruceLee/Desktop/HomeApp/ZigbeeApp/Shared.Droid/Properties/AssemblyInfo.cs","/Users/BruceLee/Desktop/HomeApp/ZigbeeApp/Shared.Droid/IO/FileUtils.cs","/Users/BruceLee/Desktop/HomeApp/ZigbeeApp/Shared.Droid/Net/NetWiFi.cs","/Users/BruceLee/Desktop/HomeApp/ZigbeeApp/Shared.Droid/Other/DensityUtil.cs","/Users/BruceLee/Desktop/HomeApp/ZigbeeApp/Shared.Droid/UI/Alert.cs","/Users/BruceLee/Desktop/HomeApp/ZigbeeApp/Shared.Droid/UI/Application.cs","/Users/BruceLee/Desktop/HomeApp/ZigbeeApp/Shared.Droid/UI/Button.cs","/Users/BruceLee/Desktop/HomeApp/ZigbeeApp/Shared.Droid/UI/DateView.cs","/Users/BruceLee/Desktop/HomeApp/ZigbeeApp/Shared.Droid/UI/TimeView.cs","/Users/BruceLee/Desktop/HomeApp/ZigbeeApp/Shared.Droid/UI/Dialog.cs","/Users/BruceLee/Desktop/HomeApp/ZigbeeApp/Shared.Droid/UI/EditText.cs","/Users/BruceLee/Desktop/HomeApp/ZigbeeApp/Shared.Droid/UI/Enum.cs","/Users/BruceLee/Desktop/HomeApp/ZigbeeApp/Shared.Droid/UI/HorizontalScrolViewLayout.cs","/Users/BruceLee/Desktop/HomeApp/ZigbeeApp/Shared.Droid/UI/HorizontalSeekBar.cs","/Users/BruceLee/Desktop/HomeApp/ZigbeeApp/Shared.Droid/UI/Lanuage.cs","/Users/BruceLee/Desktop/HomeApp/ZigbeeApp/Shared.Droid/UI/Loading.cs","/Users/BruceLee/Desktop/HomeApp/ZigbeeApp/Shared.Droid/UI/PageLayout.cs","/Users/BruceLee/Desktop/HomeApp/ZigbeeApp/Shared.Droid/UI/RowLayout.cs","/Users/BruceLee/Desktop/HomeApp/ZigbeeApp/Shared.Droid/UI/Spinner.cs","/Users/BruceLee/Desktop/HomeApp/ZigbeeApp/Shared.Droid/UI/VerticalScrolViewLayout.cs","/Users/BruceLee/Desktop/HomeApp/ZigbeeApp/Shared.Droid/UI/VerticalSeekBar.cs","/Users/BruceLee/Desktop/HomeApp/ZigbeeApp/Shared.Droid/UI/Video.cs","/Users/BruceLee/Desktop/HomeApp/ZigbeeApp/Shared.Droid/UI/View.cs","/Users/BruceLee/Desktop/HomeApp/ZigbeeApp/Shared.Droid/UI/Tip.cs","/Users/BruceLee/Desktop/HomeApp/ZigbeeApp/Shared.Droid/UI/FrameLayout.cs","/Users/BruceLee/Desktop/HomeApp/ZigbeeApp/Shared.Droid/UI/ViewGroup.cs","/Users/BruceLee/Desktop/HomeApp/ZigbeeApp/Shared.Droid/UI/Camera.cs","/Users/BruceLee/Desktop/HomeApp/ZigbeeApp/Shared.Droid/UI/TextView.cs","/Users/BruceLee/Desktop/HomeApp/ZigbeeApp/Shared.Droid/UI/ColorPicker.cs","/Users/BruceLee/Desktop/HomeApp/ZigbeeApp/Shared.Droid/UI/UrlMonitor.cs","/Users/BruceLee/Desktop/HomeApp/ZigbeeApp/Shared.Droid/UI/MusicVerticalScrolViewLayout.cs","/Users/BruceLee/Desktop/HomeApp/ZigbeeApp/Shared.Droid/UI/SwipeLayout.cs","/Users/BruceLee/Desktop/HomeApp/ZigbeeApp/Shared.Droid/UI/ImageView.cs","/Users/BruceLee/Desktop/HomeApp/ZigbeeApp/Shared.Droid/UI/WiimuUPnp.cs","/Users/BruceLee/Desktop/HomeApp/ZigbeeApp/Shared.Droid/BaseActivity.cs","/Users/BruceLee/Desktop/HomeApp/ZigbeeApp/Shared.Droid/Other/Server.cs","/Users/BruceLee/Desktop/HomeApp/ZigbeeApp/Shared.Droid/Other/ServerHandler.cs","/Users/BruceLee/Desktop/HomeApp/ZigbeeApp/Shared.Droid/Other/MusicService.cs","/Users/BruceLee/Desktop/HomeApp/ZigbeeApp/Shared.Droid/Other/MusicInfo.cs","/Users/BruceLee/Desktop/HomeApp/ZigbeeApp/Shared.Droid/Other/Volume.cs","/Users/BruceLee/Desktop/HomeApp/ZigbeeApp/Shared.Droid/CommonClass.cs","/Users/BruceLee/Desktop/HomeApp/ZigbeeApp/Shared.Droid/MyBroadcastReceive.cs","/Users/BruceLee/Desktop/HomeApp/ZigbeeApp/Shared.Droid/Net/WifiUtil.cs","/Users/BruceLee/Desktop/HomeApp/ZigbeeApp/Shared.Droid/SplashActivity.cs","/Users/BruceLee/Desktop/HomeApp/ZigbeeApp/Shared.Droid/UI/MyEchartsView.cs","/Users/BruceLee/Desktop/HomeApp/ZigbeeApp/Shared.Droid/UI/PickerView.cs","/Users/BruceLee/Desktop/HomeApp/ZigbeeApp/Shared.Droid/UI/ArcSeekBar.cs","/Users/BruceLee/Desktop/HomeApp/ZigbeeApp/Shared.Droid/Utils/TouchIDUtils.cs","/Users/BruceLee/Desktop/HomeApp/ZigbeeApp/Shared.Droid/UI/WaveSeekBar.cs","/Users/BruceLee/Desktop/HomeApp/ZigbeeApp/Shared.Droid/Additions/AboutAdditions.txt","/Users/BruceLee/Desktop/HomeApp/ZigbeeApp/Shared.Droid/Jars/AboutJars.txt","/Users/BruceLee/Desktop/HomeApp/ZigbeeApp/Shared.Droid/packages.config","/Users/BruceLee/Desktop/HomeApp/ZigbeeApp/Shared.Droid/Transforms/EnumFields.xml","/Users/BruceLee/Desktop/HomeApp/ZigbeeApp/Shared.Droid/Transforms/EnumMethods.xml","/Users/BruceLee/Desktop/HomeApp/ZigbeeApp/Shared.Droid/Transforms/Metadata.xml","/Users/BruceLee/Desktop/HomeApp/ZigbeeApp/Shared.Droid/Jars/EzvizGlobalAPI.jar","/Users/BruceLee/Desktop/HomeApp/ZigbeeApp/Shared.Droid/Jars/MyJar.jar"],"BuildActions":["Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","None","None","None","TransformFile","TransformFile","TransformFile","EmbeddedJar","EmbeddedJar"],"Analyzers":[]} |
| | | {"Format":1,"ProjectReferences":[],"MetadataReferences":[{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Java.Interop.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v8.0/Mono.Android.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/mscorlib.dll","Aliases":[]},{"FilePath":"/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/DLL/Newtonsoft.Json.dll","Aliases":[]},{"FilePath":"/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/DLL/Android/Shared.Droid.HDLWidget.dll","Aliases":[]},{"FilePath":"/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/DLL/Android/Shared.Droid.Smartrefresh.dll","Aliases":[]},{"FilePath":"/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/DLL/Android/Shared.Droid.TouchID.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/System.Core.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/System.Data.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/System.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/Facades/System.Runtime.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/System.Web.Services.dll","Aliases":[]},{"FilePath":"/Library/Frameworks/Xamarin.Android.framework/Versions/9.4.1.0/lib/xamarin.android/xbuild-frameworks/MonoAndroid/v1.0/System.Xml.dll","Aliases":[]},{"FilePath":"/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/DLL/Android/Xamarin.Android.Arch.Core.Common.dll","Aliases":[]},{"FilePath":"/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/DLL/Android/Xamarin.Android.Arch.Lifecycle.Common.dll","Aliases":[]},{"FilePath":"/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/DLL/Android/Xamarin.Android.Arch.Lifecycle.Runtime.dll","Aliases":[]},{"FilePath":"/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/DLL/Android/Xamarin.Android.Support.Animated.Vector.Drawable.dll","Aliases":[]},{"FilePath":"/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/DLL/Android/Xamarin.Android.Support.Annotations.dll","Aliases":[]},{"FilePath":"/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/DLL/Android/Xamarin.Android.Support.Compat.dll","Aliases":[]},{"FilePath":"/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/DLL/Android/Xamarin.Android.Support.Core.UI.dll","Aliases":[]},{"FilePath":"/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/DLL/Android/Xamarin.Android.Support.Core.Utils.dll","Aliases":[]},{"FilePath":"/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/DLL/Android/Xamarin.Android.Support.Fragment.dll","Aliases":[]},{"FilePath":"/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/DLL/Android/Xamarin.Android.Support.Media.Compat.dll","Aliases":[]},{"FilePath":"/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/DLL/Android/Xamarin.Android.Support.v4.dll","Aliases":[]},{"FilePath":"/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/DLL/Android/Xamarin.Android.Support.v7.AppCompat.dll","Aliases":[]},{"FilePath":"/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/DLL/Android/Xamarin.Android.Support.v7.RecyclerView.dll","Aliases":[]},{"FilePath":"/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared/DLL/Android/Xamarin.Android.Support.Vector.Drawable.dll","Aliases":[]}],"Files":["/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared.Droid/Properties/AssemblyInfo.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared.Droid/IO/FileUtils.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared.Droid/Net/NetWiFi.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared.Droid/Other/DensityUtil.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared.Droid/UI/Alert.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared.Droid/UI/Application.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared.Droid/UI/Button.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared.Droid/UI/DateView.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared.Droid/UI/TimeView.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared.Droid/UI/Dialog.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared.Droid/UI/EditText.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared.Droid/UI/Enum.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared.Droid/UI/HorizontalScrolViewLayout.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared.Droid/UI/HorizontalSeekBar.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared.Droid/UI/Lanuage.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared.Droid/UI/Loading.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared.Droid/UI/PageLayout.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared.Droid/UI/RowLayout.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared.Droid/UI/Spinner.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared.Droid/UI/VerticalScrolViewLayout.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared.Droid/UI/VerticalSeekBar.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared.Droid/UI/Video.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared.Droid/UI/View.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared.Droid/UI/Tip.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared.Droid/UI/FrameLayout.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared.Droid/UI/ViewGroup.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared.Droid/UI/Camera.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared.Droid/UI/TextView.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared.Droid/UI/ColorPicker.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared.Droid/UI/UrlMonitor.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared.Droid/UI/MusicVerticalScrolViewLayout.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared.Droid/UI/SwipeLayout.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared.Droid/UI/ImageView.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared.Droid/UI/WiimuUPnp.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared.Droid/BaseActivity.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared.Droid/Other/Server.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared.Droid/Other/ServerHandler.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared.Droid/Other/MusicService.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared.Droid/Other/MusicInfo.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared.Droid/Other/Volume.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared.Droid/CommonClass.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared.Droid/MyBroadcastReceive.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared.Droid/Net/WifiUtil.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared.Droid/SplashActivity.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared.Droid/UI/MyEchartsView.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared.Droid/UI/PickerView.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared.Droid/UI/ArcSeekBar.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared.Droid/Utils/TouchIDUtils.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared.Droid/UI/WaveSeekBar.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared.Droid/UI/GDMapView.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared.Droid/Utils/HDLUtils.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared.Droid/UI/UIPickerView.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared.Droid/UI/UICoverFlowView.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared.Droid/UI/CropImage.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared.Droid/UI/UIDrawerLayout.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared.Droid/MyService.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared.Droid/UI/GestureLockView.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared.Droid/UI/QRCode.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared.Droid/UI/Contacts.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared.Droid/UI/VerticalRefreshLayout.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared.Droid/UI/CurtainSeekBar.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared.Droid/UI/CurtainRollSeekBar.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared.Droid/UI/ArcScaleSeekBar.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared.Droid/UI/EditTextView.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared.Droid/UI/HorizontalPages.cs","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared.Droid/Additions/AboutAdditions.txt","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared.Droid/Jars/AboutJars.txt","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared.Droid/Transforms/EnumFields.xml","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared.Droid/Transforms/EnumMethods.xml","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared.Droid/Transforms/Metadata.xml","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared.Droid/Jars/EzvizGlobalAPI.jar","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared.Droid/Jars/MyJar.jar","/Users/guoxuecheng/Desktop/HomeApp/ZigbeeApp/Shared.Droid/Jars/libammsdk.jar"],"BuildActions":["Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","None","None","TransformFile","TransformFile","TransformFile","EmbeddedJar","EmbeddedJar","EmbeddedJar"],"Analyzers":[]} |
| | |
| | | <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>
|
| | |
| | | </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>
|
| | |
| | | <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" />
|
New file |
| | |
| | | Additions allow you to add arbitrary C# to the generated classes |
| | | before they are compiled. This can be helpful for providing convenience |
| | | methods or adding pure C# classes. |
| | | |
| | | == Adding Methods to Generated Classes == |
| | | |
| | | Let's say the library being bound has a Rectangle class with a constructor |
| | | that takes an x and y position, and a width and length size. It will look like |
| | | this: |
| | | |
| | | public partial class Rectangle |
| | | { |
| | | public Rectangle (int x, int y, int width, int height) |
| | | { |
| | | // JNI bindings |
| | | } |
| | | } |
| | | |
| | | Imagine we want to add a constructor to this class that takes a Point and |
| | | Size structure instead of 4 ints. We can add a new file called Rectangle.cs |
| | | with a partial class containing our new method: |
| | | |
| | | public partial class Rectangle |
| | | { |
| | | public Rectangle (Point location, Size size) : |
| | | this (location.X, location.Y, size.Width, size.Height) |
| | | { |
| | | } |
| | | } |
| | | |
| | | At compile time, the additions class will be added to the generated class |
| | | and the final assembly will a Rectangle class with both constructors. |
| | | |
| | | |
| | | == Adding C# Classes == |
| | | |
| | | Another thing that can be done is adding fully C# managed classes to the |
| | | generated library. In the above example, let's assume that there isn't a |
| | | Point class available in Java or our library. The one we create doesn't need |
| | | to interact with Java, so we'll create it like a normal class in C#. |
| | | |
| | | By adding a Point.cs file with this class, it will end up in the binding library: |
| | | |
| | | public class Point |
| | | { |
| | | public int X { get; set; } |
| | | public int Y { get; set; } |
| | | } |
New file |
| | |
| | | using System; |
| | | using Android.App; |
| | | using Android.Content; |
| | | using Android.Database; |
| | | using Android.Media; |
| | | using Android.Net.Wifi; |
| | | using Android.OS; |
| | | using Android.Util; |
| | | using Android.Widget; |
| | | using Java.Util; |
| | | using Android.Content.PM; |
| | | using Android.Locations; |
| | | using Android.Runtime; |
| | | using Android.Views; |
| | | using Com.Hdl.ON; |
| | | //using ICSharpCode.SharpZipLib.Zip; |
| | | using Android.Net; |
| | | using Android; |
| | | using System.Collections.Generic; |
| | | using System.Xml; |
| | | using Org.XmlPull.V1; |
| | | using Android.Support.V4.App; |
| | | using Android.Provider; |
| | | |
| | | namespace Shared |
| | | { |
| | | //[Activity(MainLauncher =true)] |
| | | //public class BaseActivity1 : Android.App.Activity |
| | | //{ |
| | | // public static Action<BaseActivity1, Android.App.Application> OnCreateActoin; |
| | | // protected override void OnCreate (Android.OS.Bundle savedInstanceState) |
| | | // { |
| | | // base.OnCreate (savedInstanceState); |
| | | // var mainFrameLayout = new Android.Widget.FrameLayout (this) { KeepScreenOn = true }; |
| | | // SetContentView (mainFrameLayout); |
| | | // if (OnCreateActoin != null) { |
| | | // OnCreateActoin (this, this.Application); |
| | | // } |
| | | // } |
| | | |
| | | |
| | | //} |
| | | //æ°çæ·»å ï¼å¯ä»¥è§£å³åæ¢è¯è¨åç»éé®é¢ãConfigurationChanges= ConfigChanges.ScreenSize|ConfigChanges.Orientation| ConfigChanges.Keyboard| ConfigChanges.KeyboardHidden| ConfigChanges.Locale, |
| | | [Activity (MainLauncher = true, WindowSoftInputMode = Android.Views.SoftInput.AdjustResize, LaunchMode = LaunchMode.SingleInstance, ConfigurationChanges = ConfigChanges.LayoutDirection | ConfigChanges.ScreenSize | ConfigChanges.Orientation | ConfigChanges.Keyboard | ConfigChanges.KeyboardHidden | ConfigChanges.Locale, Theme = "@style/MyTheme", ScreenOrientation = ScreenOrientation.Portrait)] |
| | | public class BaseActivity : Android.App.Activity, ICommon, ViewTreeObserver.IOnGlobalLayoutListener |
| | | { |
| | | enum RequestCode |
| | | { |
| | | ActionLocationSourceSettings = 100, |
| | | } |
| | | WifiManager.MulticastLock multicasetLock; |
| | | public static Action<BaseActivity> MonitorInfoChangedAction; |
| | | public static Action<BaseActivity, Android.App.Application> OnCreateActoin; |
| | | public static Action<BaseActivity> RefreshUIAction; |
| | | public static Action<BaseActivity> OnResumeAction; |
| | | /// <summary> |
| | | /// ç½ç»ç¶æåå |
| | | /// </summary> |
| | | public static Action<int> NetworkStateChanged; |
| | | /// <summary> |
| | | /// Activity éææ¶äºä»¶ |
| | | /// </summary> |
| | | public static Action<BaseActivity> OnDestroyAction; |
| | | Android.Widget.FrameLayout mainFrameLayout; |
| | | DisplayMetrics metric = new DisplayMetrics (); |
| | | /// <summary> |
| | | /// Yè½´åæ |
| | | /// </summary> |
| | | public static int TopMargin; |
| | | public static bool IsHideVirualButtons; |
| | | protected override void OnCreate (Android.OS.Bundle savedInstanceState) |
| | | { |
| | | try { |
| | | System.Console.WriteLine($"Activity 线ç¨ID{System.Threading.Thread.CurrentThread.ManagedThreadId}"); |
| | | if (IsHideVirualButtons) { |
| | | MyJar.Common.HideVirtualButtons (this); |
| | | } |
| | | Shared.Application.Activity = this; |
| | | if (Shared.Application.IsPad) { |
| | | this.RequestedOrientation = Android.Content.PM.ScreenOrientation.Landscape; |
| | | } |
| | | base.OnCreate (savedInstanceState); |
| | | |
| | | if (IsHideVirualButtons) { |
| | | WindowManager.DefaultDisplay.GetRealMetrics (metric); |
| | | } else { |
| | | WindowManager.DefaultDisplay.GetMetrics (metric); |
| | | } |
| | | //è·å设å¤ç宽ãé«åº¦ |
| | | Shared.Application.CurrentWidth = metric.WidthPixels; //宽度ï¼PXï¼ |
| | | //èèå°5.7寸å±å¾ä¸åç§»ï¼å é«ç¶æ§ä»¶çé«åº¦ |
| | | Shared.Application.CurrentHeight = metric.HeightPixels - TopMargin; //é«åº¦ï¼PX |
| | | |
| | | //ç¶æ§ä»¶ |
| | | var contentView = new Android.Widget.FrameLayout (this) ; |
| | | mainFrameLayout = new Android.Widget.FrameLayout(this) { KeepScreenOn = KeepScreenON } ; |
| | | contentView.AddView (mainFrameLayout, new Android.Widget.FrameLayout.LayoutParams (Shared.Application.CurrentWidth, Shared.Application.CurrentHeight) { TopMargin = TopMargin }); |
| | | SetContentView(contentView); |
| | | //çé¢ååå®ç°çæ¥å£ |
| | | Window.DecorView.ViewTreeObserver.AddOnGlobalLayoutListener (this); |
| | | |
| | | multicasetLock = WifiManager.FromContext (this).CreateMulticastLock ("WIFI"); |
| | | multicasetLock.Acquire (); |
| | | initLanguage (); |
| | | |
| | | |
| | | //å¯å¨æ¬å°é³ä¹çåå°æå¡ |
| | | StartService (new Intent (this, typeof (Other.MusicService))); |
| | | SettingsContentObserver.RegisterVolumeChangeReceiver (); |
| | | //注å广æ |
| | | registerReceiver (); |
| | | com.hdl.on.Volume.Init (); |
| | | OnCreateActoin?.Invoke (this, this.Application); |
| | | |
| | | //å¯å¨GPSåå°æå¡ |
| | | StartService(new Intent(this, typeof(GPSLocationService))); |
| | | |
| | | } catch { } |
| | | } |
| | | public static bool KeepScreenON = true; |
| | | public static bool IsEnnableGPS = true; |
| | | #region å¾åºçæé |
| | | Action<bool> imageAction; |
| | | /// <summary> |
| | | /// |
| | | /// </summary> |
| | | /// <param name="action">Action.</param> |
| | | public void SetImagePermission(Action<bool> action) |
| | | { |
| | | imageAction = action; |
| | | //å¦æè¿æ²¡ææéï¼å¾è¯·æ±æé |
| | | if (BuildVersionCodes.M <= Build.VERSION.SdkInt && (CheckSelfPermission(Manifest.Permission.WriteExternalStorage) == Permission.Denied || CheckSelfPermission(Manifest.Permission.ReadExternalStorage) == Permission.Denied)) |
| | | { |
| | | RequestPermissions(new string[] { Manifest.Permission.WriteExternalStorage,Manifest.Permission.ReadExternalStorage }, 255); |
| | | } |
| | | else |
| | | { |
| | | //ææéç´æ¥åè°åºå» |
| | | if (imageAction != null) |
| | | { |
| | | imageAction(true); |
| | | imageAction = null; |
| | | } |
| | | } |
| | | } |
| | | #endregion |
| | | #region æå头åè½ |
| | | Action<bool> cameraAction; |
| | | /// <summary> |
| | | /// |
| | | /// </summary> |
| | | /// <param name="action">Action.</param> |
| | | public void SetCamera(Action<bool> action) |
| | | { |
| | | cameraAction = action; |
| | | //å¦æè¿æ²¡ææéï¼å¾è¯·æ±æé |
| | | if (BuildVersionCodes.M <= Build.VERSION.SdkInt && CheckSelfPermission(Manifest.Permission.Camera) == Permission.Denied) |
| | | { |
| | | RequestPermissions(new string[] { Manifest.Permission.Camera }, 255); |
| | | } |
| | | else |
| | | { |
| | | //ææéç´æ¥åè°åºå» |
| | | if (cameraAction != null) |
| | | { |
| | | cameraAction(true); |
| | | cameraAction = null; |
| | | } |
| | | } |
| | | } |
| | | #endregion |
| | | #region è·åææºç¶æä¿¡æ¯æé |
| | | Action<bool> readPhoneStateAction; |
| | | /// <summary> |
| | | /// è¤ç³æå头é£åä»£ç æ¯è¾ç¹æ®ï¼å¾å¨è°ç¨è¿ä¸ªå¯å¨ä»éè¦çæé |
| | | /// </summary> |
| | | /// <param name="action">Action.</param> |
| | | public void SetPhoneState(Action<bool> action) |
| | | { |
| | | readPhoneStateAction = action; |
| | | //å¦æè¿æ²¡ææéï¼å¾è¯·æ±æé |
| | | if (BuildVersionCodes.M <= Build.VERSION.SdkInt && (CheckSelfPermission(Manifest.Permission.ReadPhoneState) == Permission.Denied || CheckSelfPermission(Manifest.Permission.CallPhone) == Permission.Denied || CheckSelfPermission(Manifest.Permission.ReadCallLog) == Permission.Denied || CheckSelfPermission(Manifest.Permission.WriteCallLog) == Permission.Denied || CheckSelfPermission(Manifest.Permission.AddVoicemail) == Permission.Denied || CheckSelfPermission(Manifest.Permission.UseSip) == Permission.Denied || CheckSelfPermission(Manifest.Permission.ProcessOutgoingCalls) == Permission.Denied)) { |
| | | RequestPermissions(new string[] { Manifest.Permission.ReadPhoneState, Manifest.Permission.CallPhone, Manifest.Permission.ReadCallLog, Manifest.Permission.WriteCallLog, Manifest.Permission.AddVoicemail, Manifest.Permission.UseSip, Manifest.Permission.ProcessOutgoingCalls }, 255); |
| | | } else { |
| | | //ææéç´æ¥åè°åºå» |
| | | if (readPhoneStateAction != null) { |
| | | readPhoneStateAction(true); |
| | | readPhoneStateAction = null; |
| | | } |
| | | } |
| | | } |
| | | #endregion |
| | | #region 读åèç³»äººä¿¡æ¯ |
| | | Action<bool> readWriteContactAction; |
| | | public void ReadWriteContact(Action<bool> action) |
| | | { |
| | | readWriteContactAction = action; |
| | | if (BuildVersionCodes.M <= Android.OS.Build.VERSION.SdkInt && (CheckSelfPermission(Manifest.Permission.ReadContacts) == Permission.Denied || CheckSelfPermission(Manifest.Permission.WriteContacts) == Permission.Denied || CheckSelfPermission(Manifest.Permission.GetAccounts) == Permission.Denied)) |
| | | { |
| | | RequestPermissions(new string[] { Android.Manifest.Permission.ReadContacts, Android.Manifest.Permission.WriteContacts, Manifest.Permission.GetAccounts }, 255); |
| | | } |
| | | else |
| | | { |
| | | //ææéç´æ¥åè°åºå» |
| | | readWriteContactAction?.Invoke(true); |
| | | readWriteContactAction = null; |
| | | } |
| | | } |
| | | #endregion |
| | | #region å¯è§å¯¹è®²çæé |
| | | Action<bool> audioRecordAction; |
| | | public void AudioRecord(Action<bool> action) |
| | | { |
| | | audioRecordAction = action; |
| | | if (BuildVersionCodes.M <= Android.OS.Build.VERSION.SdkInt && CheckSelfPermission(Manifest.Permission.RecordAudio) == Permission.Denied) |
| | | { |
| | | RequestPermissions(new string[] { Manifest.Permission.RecordAudio}, 255); |
| | | } |
| | | else |
| | | { |
| | | //ææéç´æ¥åè°åºå» |
| | | if (audioRecordAction != null) |
| | | { |
| | | audioRecordAction(true); |
| | | audioRecordAction = null; |
| | | } |
| | | } |
| | | } |
| | | #endregion |
| | | |
| | | |
| | | #region éç¨æéè¯·æ± |
| | | Dictionary<int, Action<bool>> permissionLists = new Dictionary<int, Action<bool>> { }; |
| | | int maxCode = 10000; |
| | | |
| | | /// <summary> |
| | | /// |
| | | /// </summary> |
| | | /// <param name="action">Action.</param> |
| | | public void SetPermission(Action<bool> action,string permission) |
| | | { |
| | | //å¦æè¿æ²¡ææéï¼å¾è¯·æ±æé |
| | | if (CheckSelfPermission(permission) == Permission.Denied) |
| | | { |
| | | var code = maxCode++; |
| | | permissionLists[code] = action;//æ ¹æ®è¯·æ±çCodeæ¥ç¡®è®¤è¯·æ±çæé |
| | | RequestPermissions(new string[] { permission }, code); |
| | | } |
| | | else |
| | | { |
| | | //ææéç´æ¥åè°åºå» |
| | | action?.Invoke(true); |
| | | } |
| | | } |
| | | #endregion |
| | | #region GPSçæé |
| | | Action<bool> gpsLocationAction; |
| | | /// <summary> |
| | | /// |
| | | /// </summary> |
| | | /// <param name="action">Action.</param> |
| | | public void SetGPSLocationPermission(Action<bool> action) |
| | | { |
| | | gpsLocationAction = action; |
| | | //å¦æè¿æ²¡ææéï¼å¾è¯·æ±æé |
| | | if (BuildVersionCodes.M <= Build.VERSION.SdkInt && (CheckSelfPermission(Manifest.Permission.AccessFineLocation) == Permission.Denied || CheckSelfPermission(Manifest.Permission.AccessCoarseLocation) == Permission.Denied)) |
| | | { |
| | | RequestPermissions(new string[] { Manifest.Permission.AccessFineLocation, Manifest.Permission.AccessCoarseLocation }, 255); |
| | | } |
| | | else |
| | | { |
| | | //ææéç´æ¥åè°åºå» |
| | | gpsLocationAction?.Invoke(true); |
| | | gpsLocationAction = null; |
| | | |
| | | } |
| | | } |
| | | #endregion |
| | | |
| | | #region 注å广æäºä»¶ |
| | | MyBroadcastReceive myBroadcastReceive = new MyBroadcastReceive { }; |
| | | void registerReceiver () |
| | | { |
| | | var intentFilter = new IntentFilter { }; |
| | | //çå¬çµè¯ç¶æåå |
| | | intentFilter.AddAction ("android.intent.action.PHONE_STATE"); |
| | | intentFilter.AddAction ("android.intent.action.NEW_OUTGOING_CALL"); |
| | | //çå¬ç½ç»åå |
| | | intentFilter.AddAction ("android.net.conn.CONNECTIVITY_CHANGE"); |
| | | intentFilter.AddAction ("android.intent.category.DEFAULT"); |
| | | //intentFilter.AddCategory |
| | | RegisterReceiver (myBroadcastReceive, intentFilter); |
| | | |
| | | int beforeValue = 10; |
| | | MyBroadcastReceive.ActionIdle = () => { |
| | | var audioManager = (AudioManager)GetSystemService (AudioService); |
| | | int nowValue = (int)(audioManager.GetStreamVolume (Stream.Music) * 100.0f / audioManager.GetStreamMaxVolume (Stream.Music)); |
| | | if (com.hdl.on.Volume.VolumeChange != null && beforeValue != nowValue) { |
| | | com.hdl.on.Volume.VolumeChange (beforeValue); |
| | | } |
| | | }; |
| | | |
| | | MyBroadcastReceive.ActioRinging = () => { |
| | | var audioManager = (AudioManager)GetSystemService (AudioService); |
| | | beforeValue = (int)(audioManager.GetStreamVolume (Stream.Music) * 100.0f / audioManager.GetStreamMaxVolume (Stream.Music)); |
| | | }; |
| | | } |
| | | #endregion |
| | | Action<bool> contactsAction; |
| | | /// <summary> |
| | | /// |
| | | /// </summary> |
| | | /// <param name="action">Action.</param> |
| | | public void SetContactsPermission(Action<bool> action) |
| | | { |
| | | contactsAction = action; |
| | | //å¦æè¿æ²¡ææéï¼å¾è¯·æ±æé |
| | | if (BuildVersionCodes.M <= Build.VERSION.SdkInt && CheckSelfPermission(Manifest.Permission.ReadContacts) == Permission.Denied) |
| | | { |
| | | RequestPermissions(new string[] { Manifest.Permission.ReadContacts }, 254); |
| | | } |
| | | else |
| | | { |
| | | //ææéç´æ¥åè°åºå» |
| | | contactsAction?.Invoke(true); |
| | | contactsAction = null; |
| | | } |
| | | } |
| | | #region è·åéè®¯å½ |
| | | //**çæ¬å¤æã彿æºç³»ç»å¤§äº 23 æ¶ï¼ææå¿
è¦å»å¤ææéæ¯å¦è·å** |
| | | |
| | | #endregion |
| | | public override void OnRequestPermissionsResult(int requestCode, string[] permissions, [GeneratedEnum] Permission[] grantResults) |
| | | { |
| | | base.OnRequestPermissionsResult(requestCode, permissions, grantResults); |
| | | //æ ¹æ®Codeæ¥ç¡®è®¤æé |
| | | if (permissionLists.ContainsKey(requestCode)) |
| | | { |
| | | var action = permissionLists[requestCode]; |
| | | permissionLists.Remove(requestCode); |
| | | if (0 < grantResults.Length && grantResults[0] == Permission.Granted) |
| | | { |
| | | action?.Invoke(true); |
| | | } |
| | | else { |
| | | action?.Invoke(false); |
| | | } |
| | | } |
| | | //ä¹åçåæ³ï¼åé¢å¯ä»¥éè¿ä¸é¢çæ¹å¼å¤çï¼ç¶å廿è¿å代ç |
| | | for (int i = 0; i < permissions.Length; i++) |
| | | { |
| | | switch (permissions[i]) |
| | | { |
| | | case Manifest.Permission.AccessFineLocation: |
| | | if (grantResults[i] == Permission.Granted) |
| | | { |
| | | //ææéåè°åºå» |
| | | gpsLocationAction?.Invoke(true); |
| | | gpsLocationAction = null; |
| | | } |
| | | break; |
| | | case Android.Manifest.Permission.ReadPhoneState: |
| | | if (readPhoneStateAction != null) |
| | | { |
| | | if (grantResults[i] == Permission.Granted) |
| | | { |
| | | readPhoneStateAction(true); |
| | | } |
| | | else |
| | | { |
| | | readPhoneStateAction(false); |
| | | } |
| | | readPhoneStateAction = null; |
| | | } |
| | | break; |
| | | case Manifest.Permission.ReadContacts: |
| | | if (requestCode == 254) { |
| | | if (grantResults[i] == Permission.Granted) |
| | | { |
| | | contactsAction?.Invoke(true); |
| | | } |
| | | else |
| | | { |
| | | contactsAction?.Invoke(false); |
| | | } |
| | | contactsAction = null; |
| | | } |
| | | if (requestCode == 255) |
| | | { |
| | | if (grantResults[i] == Permission.Granted) |
| | | { |
| | | readWriteContactAction?.Invoke(true); |
| | | } |
| | | else |
| | | { |
| | | readWriteContactAction?.Invoke(false); |
| | | } |
| | | readWriteContactAction = null; |
| | | } |
| | | |
| | | break; |
| | | case Manifest.Permission.RecordAudio: |
| | | if (audioRecordAction != null) |
| | | { |
| | | if (grantResults[i] == Permission.Granted) |
| | | { |
| | | audioRecordAction(true); |
| | | } |
| | | else |
| | | { |
| | | audioRecordAction(false); |
| | | } |
| | | audioRecordAction = null; |
| | | } |
| | | break; |
| | | case Manifest.Permission.Camera: |
| | | if (cameraAction != null) |
| | | { |
| | | if (grantResults[i] == Permission.Granted) |
| | | { |
| | | cameraAction(true); |
| | | } |
| | | else |
| | | { |
| | | cameraAction(false); |
| | | } |
| | | cameraAction = null; |
| | | } |
| | | break; |
| | | case Manifest.Permission.WriteExternalStorage: |
| | | if (imageAction != null) |
| | | { |
| | | if (grantResults[i] == Permission.Granted) |
| | | { |
| | | imageAction(true); |
| | | } |
| | | else |
| | | { |
| | | imageAction(false); |
| | | } |
| | | imageAction = null; |
| | | } |
| | | break; |
| | | |
| | | } |
| | | } |
| | | } |
| | | |
| | | |
| | | protected override void OnResume () |
| | | { |
| | | base.OnResume (); |
| | | OnResumeAction?.Invoke(this); |
| | | } |
| | | |
| | | |
| | | public override void OnWindowFocusChanged (bool hasFocus) |
| | | { |
| | | base.OnWindowFocusChanged (hasFocus); |
| | | if (hasFocus && null == Shared.Application.RootFrameLayout) { |
| | | initImages (() => { |
| | | mainFrameLayout.Post (() => { |
| | | Shared.Application.RootFrameLayout = mainFrameLayout; |
| | | RefreshUIAction?.Invoke(this); |
| | | }); |
| | | }); |
| | | } |
| | | } |
| | | /// <summary> |
| | | /// å®¡æ ¸æåæ¶é´ |
| | | /// </summary> |
| | | public static DateTime VerifyDateTime = DateTime.Now; |
| | | public static Action BackKeyAction; |
| | | public override bool DispatchKeyEvent (Android.Views.KeyEvent e) |
| | | { |
| | | //ç¾åº¦è®¤è¯è¦æ±è¿å鮿ææï¼å è¿ä¸ªæ¯ä¸ºäºå®¡æ ¸éè¿ |
| | | //if (DateTime.Now < VerifyDateTime) { |
| | | // Console.WriteLine ("base VerifyDateTime"); |
| | | // VerifyDateTime = DateTime.MinValue; |
| | | // //return base.DispatchKeyEvent (e); |
| | | //} |
| | | if (e.KeyCode == Android.Views.Keycode.Back && e.Action == Android.Views.KeyEventActions.Down) { |
| | | BackKeyAction?.Invoke (); |
| | | // Console.WriteLine ("BackKeyAction End!!!"); |
| | | // return true; |
| | | } |
| | | return base.DispatchKeyEvent (e); |
| | | } |
| | | |
| | | public override bool OnKeyDown([GeneratedEnum] Keycode keyCode, KeyEvent e) |
| | | { |
| | | if(keyCode== Keycode.Back){ |
| | | //Console.WriteLine ("OnKeyDown1"); |
| | | //ä¸å
è®¸ç»æç¨åºï¼åªæ¯éåºå°åå° |
| | | if (VerifyDateTime == DateTime.MaxValue) |
| | | { |
| | | //Console.WriteLine ("OnKeyDown2"); |
| | | VerifyDateTime = DateTime.MinValue; |
| | | MoveTaskToBack (false); |
| | | //} else { |
| | | //Console.WriteLine ("OnKeyDown3"); |
| | | //BackKeyAction (); |
| | | //return true; |
| | | } |
| | | return true; |
| | | } |
| | | return true; |
| | | //return base.OnKeyDown(keyCode, e); |
| | | } |
| | | |
| | | protected override void OnActivityResult(int requestCode, [GeneratedEnum] Result resultCode, Intent data) |
| | | { |
| | | base.OnActivityResult(requestCode, resultCode, data); |
| | | if (requestCode == 0x30) |
| | | { |
| | | if (data == null) { |
| | | Shared.Contacts.ContactAction?.Invoke(null, null); |
| | | } |
| | | else |
| | | { |
| | | string phoneNum = null; |
| | | string contactName = null; |
| | | // å建å
容解æè
|
| | | var contentResolver = ContentResolver; |
| | | ICursor cursor = null; |
| | | if (data.Data != null) |
| | | { |
| | | cursor = contentResolver.Query(data.Data, new string[] { "display_name", "data1" }, null, null, null); |
| | | } |
| | | while (cursor.MoveToNext()) |
| | | { |
| | | contactName = cursor.GetString(cursor.GetColumnIndex("display_name")); |
| | | phoneNum = cursor.GetString(cursor.GetColumnIndex("data1")); |
| | | } |
| | | cursor.Close(); |
| | | // æçµè¯å·ç ä¸ç - ç¬¦å· æ¿æ¢æç©ºæ ¼ |
| | | if (phoneNum != null) |
| | | { |
| | | phoneNum = phoneNum.Replace("-", " "); |
| | | // ç©ºæ ¼å»æ 为ä»ä¹ä¸ç´æ¥-æ¿æ¢æ"" å 为æµè¯çæ¶ååç°è¿æ¯ä¼æç©ºæ ¼ åªè½è¿ä¹å¤ç |
| | | phoneNum = phoneNum.Replace(" ", ""); |
| | | } |
| | | Shared.Contacts.ContactAction?.Invoke(contactName, phoneNum); |
| | | } |
| | | } |
| | | } |
| | | |
| | | protected override void OnDestroy () |
| | | { |
| | | base.OnDestroy(); |
| | | |
| | | OnDestroyAction?.Invoke(this); |
| | | //å
³éæ¬å°é³ä¹æä¾çæå¡ |
| | | StopService (new Intent (this, typeof (Other.MusicService))); |
| | | |
| | | if (multicasetLock != null) { |
| | | multicasetLock.Release (); |
| | | } |
| | | //ç§»é¤ææºç¶æå¹¿æ |
| | | UnregisterReceiver (myBroadcastReceive); |
| | | |
| | | SettingsContentObserver.UnregisterVolumeChangeReceiver (); |
| | | |
| | | //Android.OS.Process.KillProcess (Android.OS.Process.MyPid ()); |
| | | } |
| | | |
| | | void initLanguage () |
| | | { |
| | | Locale l = Locale.Default; |
| | | string language = l.Language; |
| | | if ("zh" == language) { |
| | | Language.CurrentLanguage = "Chinese"; |
| | | } else { |
| | | Language.CurrentLanguage = "English"; |
| | | } |
| | | } |
| | | |
| | | void writeFiles (string path) |
| | | { |
| | | //åå»ºæ ¹ç®å½ |
| | | System.IO.Directory.CreateDirectory (System.IO.Path.Combine (Shared.Application.RootPath, path)); |
| | | var paths = Assets.List (path); |
| | | foreach (string fileOrFolderPath in paths) { |
| | | var tempString = fileOrFolderPath.ToLower (); |
| | | //ç³»ç»èªå¸¦çå¾ |
| | | if (tempString == "license" || tempString == "images" || tempString == "webkit") { |
| | | continue; |
| | | } |
| | | if (fileOrFolderPath.EndsWith (".zip")) { |
| | | //decomparessFile (fileOrFolderPath, Shared.IO.FileUtils.RootPath); |
| | | continue; |
| | | } |
| | | if (tempString.EndsWith (".txt") || tempString.EndsWith (".png") || tempString.EndsWith (".jpg")) { |
| | | System.IO.Stream inputStream = null; |
| | | try { |
| | | //æ ¹ç®å½ä¸å¦æç´æ¥æ¯æä»¶çå°±ä¸éè¦å¤å¶ |
| | | if (path != "") { |
| | | inputStream = this.Assets.Open (path + "/" + fileOrFolderPath); |
| | | //åå½åæä»¶ |
| | | IO.FileUtils.WriteFileByInputStream (path + "/" + fileOrFolderPath, inputStream); |
| | | } |
| | | |
| | | } catch { } finally { |
| | | if (inputStream != null) { |
| | | inputStream.Close (); |
| | | } |
| | | } |
| | | } else { |
| | | if (path == "") { |
| | | writeFiles (fileOrFolderPath); |
| | | } else { |
| | | writeFiles (path + "/" + fileOrFolderPath); |
| | | } |
| | | } |
| | | } |
| | | } |
| | | |
| | | void initImages (Action action) |
| | | { |
| | | var version = PackageManager.GetPackageInfo (Application.PackageName, 0).VersionCode; |
| | | System.Threading.Tasks.Task.Run (() => { |
| | | try { |
| | | var SharedPref = GetSharedPreferences ("PrivateData", Android.Content.FileCreationMode.Private); |
| | | //夿æ¯å¦å·²ç»åå§åå¾çæåï¼æåäºå°±ä¸å¨å |
| | | if (SharedPref.GetInt ("Version", -1) == version) { |
| | | return; |
| | | } |
| | | |
| | | writeFiles (""); |
| | | |
| | | //å
¨é¨åå§ååææçä¿¡æ¯åå°±å建è¿ä¸ªæä»¶æ¥æ è®°ä¸ä¸ |
| | | var v = SharedPref.Edit (); |
| | | v.PutInt ("Version", version); |
| | | v.Apply (); |
| | | v.Commit (); |
| | | } catch { } finally { |
| | | action (); |
| | | } |
| | | }); |
| | | } |
| | | |
| | | |
| | | public static Action<MonitorData> ControlMonitorSceneAction; |
| | | public void ControlMonitorScene (MonitorData p0) |
| | | { |
| | | ControlMonitorSceneAction?.Invoke(p0); |
| | | } |
| | | |
| | | public static Action<string, string> MonitorMessagePushAction; |
| | | public void MonitorMessagePush (string p0, string p1) |
| | | { |
| | | MonitorMessagePushAction?.Invoke(p0, p1); |
| | | } |
| | | |
| | | public static Action<MonitorData> MonitorSceneDataAction; |
| | | public void MonitorSceneData (MonitorData p0) |
| | | { |
| | | MonitorSceneDataAction?.Invoke(p0); |
| | | } |
| | | |
| | | public void OnGlobalLayout() |
| | | { |
| | | var rect = new Android.Graphics.Rect(); |
| | | mainFrameLayout.GetWindowVisibleDisplayFrame(rect); |
| | | |
| | | var softHeight = metric.HeightPixels - (rect.Bottom - rect.Top); |
| | | |
| | | var tempHeight = EditText.FocusBottom + softHeight - metric.HeightPixels; |
| | | //if (0 < tempHeight) { |
| | | // mainFrameLayout.SetY (-tempHeight - 10); |
| | | //} else { |
| | | // mainFrameLayout.SetY (0); |
| | | //} |
| | | if (0 < tempHeight) |
| | | { |
| | | mainFrameLayout.SetY(TopMargin - tempHeight - 10); |
| | | } |
| | | else |
| | | { |
| | | mainFrameLayout.SetY(TopMargin); |
| | | } |
| | | |
| | | //System.Console.WriteLine($"å±å¹é«åº¦{mainFrameLayout.Height} è¾å
¥æ³é«åº¦{softHeight}"); |
| | | //å½åå·²ç»æ¯éèç¶æäº |
| | | //if(softHeight<=108){ |
| | | if (IsHideVirualButtons) |
| | | { |
| | | MyJar.Common.HideVirtualButtons(this); |
| | | } |
| | | //} |
| | | } |
| | | |
| | | public void MoveToFront() { |
| | | SystemHelper.SetTopApp(this.BaseContext); |
| | | } |
| | | |
| | | ///// <summary> |
| | | ///// è§£åæä»¶å°æå®æä»¶å¤¹ |
| | | ///// </summary> |
| | | ///// <param name="sourceFile">å缩æä»¶</param> |
| | | ///// <param name="destinationDirectory">ç®æ æä»¶å¤¹ï¼å¦æä¸ºç©ºåè§£åå°å½åæä»¶å¤¹ä¸</param> |
| | | ///// <param name="password">å¯ç </param> |
| | | ///// <returns></returns> |
| | | //public bool decomparessFile (string filePath, string destinationDirectory, string password = null) |
| | | //{ |
| | | // bool result = false; |
| | | // var bufferSize = 1024; |
| | | |
| | | // try { |
| | | // if (!System.IO.Directory.Exists (destinationDirectory)) { |
| | | // System.IO.Directory.CreateDirectory (destinationDirectory); |
| | | // } |
| | | |
| | | // using (var zipStream = new ZipInputStream (Assets.Open (filePath))) { |
| | | // zipStream.Password = password; |
| | | // var zipEntry = zipStream.GetNextEntry (); |
| | | |
| | | // while (zipEntry != null) { |
| | | // if (zipEntry.IsDirectory)//å¦ææ¯æä»¶å¤¹åå建 |
| | | // { |
| | | // System.IO.Directory.CreateDirectory (System.IO.Path.Combine (destinationDirectory, |
| | | // System.IO.Path.GetDirectoryName (zipEntry.Name))); |
| | | // } else { |
| | | // string fileName = System.IO.Path.GetFileName (zipEntry.Name); |
| | | // if (!string.IsNullOrEmpty (fileName) && fileName.Trim ().Length > 0) { |
| | | // var fileItem = new System.IO.FileInfo (System.IO.Path.Combine (destinationDirectory, zipEntry.Name)); |
| | | // using (var writeStream = fileItem.Create ()) { |
| | | // var buffer = new byte [bufferSize]; |
| | | // int readLength = 0; |
| | | |
| | | // do { |
| | | // readLength = zipStream.Read (buffer, 0, bufferSize); |
| | | // writeStream.Write (buffer, 0, readLength); |
| | | // } while (readLength == bufferSize); |
| | | |
| | | // writeStream.Flush (); |
| | | // writeStream.Close (); |
| | | // } |
| | | // fileItem.LastWriteTime = zipEntry.DateTime; |
| | | // } |
| | | // } |
| | | // zipEntry = zipStream.GetNextEntry ();//è·åä¸ä¸ä¸ªæä»¶ |
| | | // } |
| | | // zipStream.Close (); |
| | | // } |
| | | // result = true; |
| | | // } catch (System.Exception ex) { |
| | | // System.Console.WriteLine ($"æä»¶è§£ååçé误:{ex}"); |
| | | // } |
| | | |
| | | // return result; |
| | | //} |
| | | } |
| | | |
| | | /// <summary> |
| | | /// çå¬é³éçåå |
| | | /// </summary> |
| | | class SettingsContentObserver : ContentObserver |
| | | { |
| | | static SettingsContentObserver settingsContentObserver; |
| | | static Context context; |
| | | public SettingsContentObserver(Context c, Handler handler) : base(handler) |
| | | { |
| | | context = c; |
| | | } |
| | | public override void OnChange(bool selfChange) |
| | | { |
| | | base.OnChange(selfChange); |
| | | if(MyBroadcastReceive.IsCalling){ |
| | | return; |
| | | } |
| | | var audioManager = (AudioManager)context.GetSystemService(Context.AudioService); |
| | | float currentVolume = audioManager.GetStreamVolume(Stream.Music) * 100.0f / audioManager.GetStreamMaxVolume(Stream.Music); |
| | | if (com.hdl.on.Volume.VolumeChange != null) |
| | | { |
| | | System.Console.WriteLine ($"åªä½é³éååVolume:{currentVolume}"); |
| | | com.hdl.on.Volume.VolumeChange((int)currentVolume); |
| | | } |
| | | } |
| | | |
| | | public static void RegisterVolumeChangeReceiver() |
| | | { |
| | | settingsContentObserver = new SettingsContentObserver(Shared.Application.Activity, new Handler()); |
| | | context.ContentResolver.RegisterContentObserver(Android.Provider.Settings.System.ContentUri, true, settingsContentObserver); |
| | | } |
| | | public static void UnregisterVolumeChangeReceiver() |
| | | { |
| | | context.ContentResolver.UnregisterContentObserver(settingsContentObserver); |
| | | } |
| | | } |
| | | |
| | | internal static class SystemHelper |
| | | { |
| | | /** |
| | | * 夿æ¬å°æ¯å¦å·²ç»å®è£
å¥½äºæå®çåºç¨ç¨åºå
|
| | | * |
| | | * @param packageNameTarget ï¼å¾
夿ç App å
åï¼å¦ å¾®å com.sina.weibo |
| | | * @return å·²å®è£
æ¶è¿å true,ä¸å卿¶è¿å false |
| | | */ |
| | | public static bool AppIsExist(Context context, string packageNameTarget) |
| | | { |
| | | return true; |
| | | //if ("" != packageNameTarget.Trim()) |
| | | //{ |
| | | // PackageManager packageManager = context.PackageManager; |
| | | // var packageInfoList = packageManager.GetInstalledPackages(PackageInfoFlags.MatchUninstalledPackages); |
| | | // foreach (PackageInfo packageInfo in packageInfoList) |
| | | // { |
| | | // var packageNameSource = packageInfo.PackageName; |
| | | // if (packageNameSource == (packageNameTarget)) |
| | | // { |
| | | // return true; |
| | | // } |
| | | // } |
| | | //} |
| | | //return false; |
| | | } |
| | | |
| | | /** |
| | | * å°æ¬åºç¨ç½®é¡¶å°æå端 |
| | | * 彿¬åºç¨ä½äºåå°æ¶ï¼åå°å®åæ¢å°æå端 |
| | | * |
| | | * @param context |
| | | */ |
| | | public static void SetTopApp(Context context) |
| | | { |
| | | if (!isRunningForeground(context)) |
| | | { |
| | | /**è·åActivityManager*/ |
| | | var activityManager = (ActivityManager)context.GetSystemService(Activity.ActivityService); |
| | | |
| | | /**è·å¾å½åè¿è¡çtask(ä»»å¡)*/ |
| | | var taskInfoList = activityManager.GetRunningTasks(100); |
| | | foreach (ActivityManager.RunningTaskInfo taskInfo in taskInfoList) |
| | | { |
| | | /**æ¾å°æ¬åºç¨ç taskï¼å¹¶å°å®åæ¢å°åå°*/ |
| | | if (taskInfo.TopActivity.PackageName == (context.PackageName)) |
| | | { |
| | | activityManager.MoveTaskToFront(taskInfo.Id, 0); |
| | | break; |
| | | } |
| | | } |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * 夿æ¬åºç¨æ¯å¦å·²ç»ä½äºæå端 |
| | | * |
| | | * @param context |
| | | * @return æ¬åºç¨å·²ç»ä½äºæå端æ¶ï¼è¿å trueï¼å¦åè¿å false |
| | | */ |
| | | static bool isRunningForeground(Context context) |
| | | { |
| | | var activityManager = (ActivityManager)context.GetSystemService(Activity.ActivityService); |
| | | var appProcessInfoList = activityManager.RunningAppProcesses; |
| | | /**æä¸¾è¿ç¨*/ |
| | | foreach (ActivityManager.RunningAppProcessInfo appProcessInfo in appProcessInfoList) |
| | | { |
| | | if (appProcessInfo.Importance == ActivityManager.RunningAppProcessInfo.ImportanceForeground) |
| | | { |
| | | if (appProcessInfo.ProcessName == (context.ApplicationInfo.ProcessName)) |
| | | { |
| | | return true; |
| | | } |
| | | } |
| | | } |
| | | return false; |
| | | } |
| | | } |
| | | } |
| | | |
New file |
| | |
| | | using System; |
| | | using System.Collections.Generic; |
| | | using System.Linq; |
| | | using System.Text; |
| | | using Android.App; |
| | | using Android.Content; |
| | | using Android.OS; |
| | | using Android.Runtime; |
| | | using Android.Views; |
| | | using Android.Widget; |
| | | using Android.Util; |
| | | using Android.Graphics; |
| | | using Android.Graphics.Drawables; |
| | | |
| | | namespace Shared |
| | | { |
| | | /// <summary> |
| | | /// Button æé® |
| | | /// </summary> |
| | | public class Button : View |
| | | { |
| | | /// <summary> |
| | | /// å½åè§å¾ |
| | | /// </summary> |
| | | /// <value>The android button.</value> |
| | | AndroidButton currentButton |
| | | { |
| | | get |
| | | { |
| | | |
| | | return androidView as AndroidButton; |
| | | } |
| | | set |
| | | { |
| | | this.androidView = value; |
| | | } |
| | | } |
| | | |
| | | public Button() |
| | | { |
| | | currentButton = new AndroidButton (Application.Activity); |
| | | currentButton.SetTextColor (Android.Graphics.Color.White); |
| | | currentButton.MouseDownEventHandler += (sender, e) => { |
| | | OnMouseDown(); |
| | | }; |
| | | currentButton.MouseUPEventHandler += (sender, e) => { |
| | | OnMouseUp(); |
| | | }; |
| | | currentButton.SizeChangeEventHandler+= (sender, e) => { |
| | | OnSizeChange(e); |
| | | }; |
| | | } |
| | | |
| | | /// <summary> |
| | | /// æåå¤§å° |
| | | /// </summary> |
| | | /// <value>The size of the text.</value> |
| | | public float TextSize |
| | | { |
| | | get |
| | | { |
| | | return currentButton.TextSize; |
| | | } |
| | | set |
| | | { |
| | | currentButton.SetTextSize(ComplexUnitType.Sp, value); |
| | | } |
| | | } |
| | | |
| | | int textID; |
| | | /// <summary> |
| | | /// æ ¹æ®IDè·å对åºç夿³¨ |
| | | /// </summary> |
| | | /// <value>The text I.</value> |
| | | public int TextID |
| | | { |
| | | get |
| | | { |
| | | return textID; |
| | | } |
| | | set |
| | | { |
| | | textID = value; |
| | | Text = Language.StringByID (TextID); |
| | | } |
| | | } |
| | | |
| | | /// <summary> |
| | | /// ææ¬ |
| | | /// </summary> |
| | | /// <value>The text.</value> |
| | | public string Text |
| | | { |
| | | get |
| | | { |
| | | return currentButton.Text; |
| | | } |
| | | set |
| | | { |
| | | |
| | | currentButton.Text = value; |
| | | } |
| | | } |
| | | |
| | | /// <summary> |
| | | /// å·æ° |
| | | /// </summary> |
| | | public override void Refresh() |
| | | { |
| | | base.Refresh (); |
| | | IsSelected = isSelected; |
| | | } |
| | | |
| | | private uint textColor; |
| | | /// <summary> |
| | | /// æåé¢è² |
| | | /// </summary> |
| | | /// <value>The color of the text.</value> |
| | | public uint TextColor |
| | | { |
| | | get |
| | | { |
| | | return textColor; |
| | | } |
| | | set |
| | | { |
| | | textColor = value; |
| | | byte r, g, b, a; |
| | | r = (byte)(this.textColor / 256 / 256 % 256); |
| | | g = (byte)(this.textColor / 256 % 256); |
| | | b = (byte)(this.textColor % 256); |
| | | a = (byte)(this.textColor / 256 / 256 / 256 % 256); |
| | | |
| | | currentButton.SetTextColor(Android.Graphics.Color.Argb(a, r, g, b)); |
| | | } |
| | | } |
| | | |
| | | private bool isSelected; |
| | | private string beforeImagePath; |
| | | /// <summary> |
| | | /// éä¸ç¶æ |
| | | /// </summary> |
| | | /// <value><c>true</c> if this instance is selected; otherwise, <c>false</c>.</value> |
| | | public bool IsSelected |
| | | { |
| | | get |
| | | { |
| | | return this.isSelected; |
| | | } |
| | | set |
| | | { |
| | | this.isSelected = value; |
| | | if (this.RealView.Parent == null || Radius != 0) |
| | | { |
| | | return; |
| | | } |
| | | if (this.isSelected) |
| | | { |
| | | if (beforeImagePath == this.SelectedImagePath) |
| | | { |
| | | return; |
| | | } |
| | | |
| | | if (this.Background(this.SelectedImagePath)) |
| | | { |
| | | beforeImagePath = this.SelectedImagePath; |
| | | } |
| | | } |
| | | else |
| | | { |
| | | if (beforeImagePath == this.UnSelectedImagePath) |
| | | { |
| | | return; |
| | | } |
| | | |
| | | if (this.Background(this.UnSelectedImagePath)) |
| | | { |
| | | beforeImagePath = this.UnSelectedImagePath; |
| | | } |
| | | } |
| | | } |
| | | } |
| | | |
| | | private TextAlignment textAlignment= TextAlignment.Center; |
| | | /// <summary> |
| | | /// æå坹齿¹å¼ |
| | | /// </summary> |
| | | /// <param name="horizontalAlignment">Horizontal alignment.</param> |
| | | /// <param name="verticalAlignment">Vertical alignment.</param> |
| | | public TextAlignment TextAlignment { |
| | | get { |
| | | return this.textAlignment; |
| | | } |
| | | set { |
| | | this.textAlignment = value; |
| | | switch (value) { |
| | | case TextAlignment.TopLeft: |
| | | this. currentButton.Gravity = GravityFlags.Top | GravityFlags.Left; |
| | | break; |
| | | case TextAlignment.TopCenter: |
| | | this. currentButton.Gravity = GravityFlags.Top | GravityFlags.Center; |
| | | break; |
| | | case TextAlignment.TopRight: |
| | | this. currentButton.Gravity = GravityFlags.Top | GravityFlags.Right; |
| | | break; |
| | | case TextAlignment.CenterLeft: |
| | | this. currentButton.Gravity = GravityFlags.Center | GravityFlags.Left; |
| | | break; |
| | | case TextAlignment.Center: |
| | | this. currentButton.Gravity = GravityFlags.Center | GravityFlags.Center; |
| | | break; |
| | | case TextAlignment.CenterRight: |
| | | this. currentButton.Gravity = GravityFlags.Center | GravityFlags.Right; |
| | | break; |
| | | case TextAlignment.BottomLeft: |
| | | this. currentButton.Gravity = GravityFlags.Bottom | GravityFlags.Left; |
| | | break; |
| | | case TextAlignment.BottomCenter: |
| | | this. currentButton.Gravity = GravityFlags.Bottom | GravityFlags.Center; |
| | | break; |
| | | case TextAlignment.BottomRight: |
| | | this. currentButton.Gravity = GravityFlags.Bottom | GravityFlags.Right; |
| | | break; |
| | | } |
| | | } |
| | | } |
| | | |
| | | /// <summary> |
| | | /// å
è¾¹è· |
| | | /// </summary> |
| | | /// <value>The padding.</value> |
| | | public override Padding Padding { |
| | | get { |
| | | return new Padding (this. currentButton.PaddingTop, this. currentButton.PaddingLeft,this. currentButton.PaddingBottom, this. currentButton.PaddingRight); |
| | | } |
| | | set { |
| | | //base.Padding = value; |
| | | this. currentButton.SetPadding (DensityUtil.Dip2Px( value.Left),DensityUtil.Dip2Px( value.Top),DensityUtil.Dip2Px( value.Right),DensityUtil.Dip2Px( value.Bottom)); |
| | | } |
| | | } |
| | | |
| | | private string selectedImagePath; |
| | | /// <summary> |
| | | /// éæ©æ¶èæ¯å¾è·¯å¾ |
| | | /// </summary> |
| | | /// <value>The selected image path.</value> |
| | | public string SelectedImagePath |
| | | { |
| | | get |
| | | { |
| | | return this.selectedImagePath; |
| | | } |
| | | set{ |
| | | this.selectedImagePath = value; |
| | | IsSelected = IsSelected; |
| | | } |
| | | } |
| | | |
| | | private string unSelectedImagePath; |
| | | /// <summary> |
| | | /// ééä¸ç¶æçèæ¯å¾è·¯å¾ |
| | | /// </summary> |
| | | /// <value>The un selected image path.</value> |
| | | public string UnSelectedImagePath |
| | | { |
| | | get |
| | | { |
| | | return this.unSelectedImagePath; |
| | | } |
| | | set |
| | | { |
| | | this.unSelectedImagePath = value; |
| | | IsSelected = IsSelected; |
| | | } |
| | | } |
| | | |
| | | } |
| | | public class AndroidButton : Android.Widget.Button |
| | | { |
| | | |
| | | public AndroidButton(Context context) |
| | | : base(context) |
| | | { |
| | | this.SetBackgroundColor (Android.Graphics.Color.Transparent); |
| | | this.SetPadding (0, 0, 0, 0); |
| | | } |
| | | |
| | | public AndroidButton(Context context, IAttributeSet attrs) |
| | | : base(context, attrs) { } |
| | | |
| | | protected AndroidButton(IntPtr javaReference, JniHandleOwnership transfer) |
| | | : base(javaReference, transfer) { } |
| | | |
| | | public AndroidButton(Context context, IAttributeSet attrs, int defStyle) |
| | | : base(context, attrs, defStyle) { } |
| | | |
| | | /// <summary> |
| | | /// ç¹å»å¼¹èµ·äºä»¶ |
| | | /// </summary> |
| | | public EventHandler MouseUPEventHandler; |
| | | /// <summary> |
| | | /// ç¹å»æä¸äºä»¶ |
| | | /// </summary> |
| | | public EventHandler MouseDownEventHandler; |
| | | |
| | | /// <summary> |
| | | /// ç¹å»äºä»¶ |
| | | /// </summary> |
| | | /// <returns>The touch event.</returns> |
| | | /// <param name="e">E.</param> |
| | | public override bool OnTouchEvent(Android.Views.MotionEvent e) |
| | | { |
| | | if (e.Action == Android.Views.MotionEventActions.Down && MouseDownEventHandler != null) |
| | | { |
| | | MouseDownEventHandler(this, EventArgs.Empty); |
| | | } |
| | | else if (e.Action == Android.Views.MotionEventActions.Up && MouseUPEventHandler != null) |
| | | { |
| | | MouseUPEventHandler(this, EventArgs.Empty); |
| | | } |
| | | return base.OnTouchEvent(e); |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 大å°ååäºä»¶ |
| | | /// </summary> |
| | | public EventHandler<Size> SizeChangeEventHandler; |
| | | |
| | | public override ViewGroup.LayoutParams LayoutParameters |
| | | { |
| | | get |
| | | { |
| | | return base.LayoutParameters; |
| | | } |
| | | set |
| | | { |
| | | var layoutParams = base.LayoutParameters; |
| | | base.LayoutParameters = value; |
| | | |
| | | if (layoutParams == null || layoutParams.Width != value.Width || layoutParams.Height != value.Height) |
| | | { |
| | | if (this.SizeChangeEventHandler != null) |
| | | { |
| | | this.SizeChangeEventHandler(this, new Size((int)this.LayoutParameters.Width, (int)this.LayoutParameters.Height)); |
| | | } |
| | | } |
| | | } |
| | | } |
| | | |
| | | } |
| | | } |
| | | |
| | | |
New file |
| | |
| | | using System; |
| | | using Android.Content; |
| | | using Android.OS; |
| | | |
| | | namespace Shared |
| | | { |
| | | public class CommonClass |
| | | { |
| | | /// <summary> |
| | | /// æå¼åºç¨ |
| | | /// </summary> |
| | | /// <param name="packetName">å
å</param> |
| | | /// <param name="activityName"></param> |
| | | public static void OpenApp(string packetName) |
| | | { |
| | | if (Application.Activity == null || packetName == null) |
| | | { |
| | | return; |
| | | } |
| | | |
| | | if (!isAvilible(Application.Activity, packetName)) |
| | | { |
| | | return; |
| | | } |
| | | var pi = Application.Activity.PackageManager.GetPackageInfo(packetName, 0); |
| | | if (pi == null) |
| | | { |
| | | return; |
| | | } |
| | | var resolveIntent = new Intent(Intent.ActionMain, null); |
| | | resolveIntent.AddCategory(Intent.CategoryLauncher); |
| | | resolveIntent.SetPackage(pi.PackageName); |
| | | |
| | | var apps = Application.Activity.PackageManager.QueryIntentActivities(resolveIntent, 0); |
| | | |
| | | if (0 < apps.Count) |
| | | { |
| | | var ri = apps[0]; |
| | | string pkgName = ri.ActivityInfo.PackageName; |
| | | string className = ri.ActivityInfo.Name; |
| | | |
| | | var intent = new Intent(Intent.ActionMain); |
| | | intent.AddCategory(Intent.CategoryLauncher); |
| | | |
| | | //launchFlagsï¼å建ä¸ä¸ªæ°çè¿ç¨æ¥è¿è¡è¿ä¸ªActivityï¼ä¹å¯ä»¥ä¸éè¦ï¼è¿æ ·å°±æ¯å¨å½åAPPå
æå¼ï¼åä¸ä¸ªè¿ç¨ï¼ |
| | | intent.SetFlags(ActivityFlags.NewTask | ActivityFlags.ResetTaskIfNeeded); |
| | | intent.SetAction("android.intent.action.VIEW"); |
| | | var cn = new ComponentName(pkgName, className); |
| | | intent.SetComponent(cn); |
| | | Application.Activity.StartActivity(intent); |
| | | } |
| | | } |
| | | /** |
| | | * æ£æ¥ææºä¸æ¯å¦å®è£
äºæå®ç软件 |
| | | * @param context |
| | | * @param packageName |
| | | * @return |
| | | */ |
| | | public static bool isAvilible(Context context, string packageName) |
| | | { |
| | | var packageManager = context.PackageManager; |
| | | var packageInfos = packageManager.GetInstalledPackages(0); |
| | | var packageNames = new System.Collections.Generic.List<string>(); |
| | | |
| | | if (packageInfos != null) |
| | | { |
| | | for (int i = 0; i < packageInfos.Count; i++) |
| | | { |
| | | var packName = packageInfos[i].PackageName; |
| | | packageNames.Add(packName); |
| | | } |
| | | } |
| | | // 夿packageNames䏿¯å¦æç®æ ç¨åºçå
åï¼æTRUEï¼æ²¡æFALSE |
| | | return packageNames.Contains(packageName); |
| | | } |
| | | /// <summary> |
| | | /// æå¼çé¢ |
| | | /// </summary> |
| | | /// <param name="action">Action.</param> |
| | | public static void OpenAction(string action){ |
| | | try |
| | | { |
| | | Application.Activity.StartActivity(new Intent(action)); |
| | | }catch{} |
| | | } |
| | | |
| | | } |
| | | } |
| | | |
| | | |
| | | |
| | | //ä½ å¥½ï¼ç»è¿æµè¯ï¼æä»¬åç°æä¸¤ç§æ¹æ³é½å¯ä»¥å®ç°æµåªä½çææ¾ã |
| | | //第ä¸ç§ï¼å¯ä»¥å®ç°é³ä¹æ¨éææ¾ï¼ä½ä½éªææå¾ä¸å¥½ï¼å 为è·åé³ä¹ç宿æ¾å°åæ¶é´å¾é¿ï¼å®ç°æè·¯å¦ä¸ï¼ |
| | | //1ãæä»¬Appå
è·åTokenåæ¶é´ |
| | | //2ãç¶åç¨Tidalå¸å·ç´æ¥ç»å½airableæå¡å¨ |
| | | //3ãè·åææ¾å表ï¼ä¸æ¯çå®çææ¾å°åï¼ |
| | | //4ãæ ¹æ®ææ¾å表å»è·åçå®çææ¾å°åï¼è¿éè·åæ¶é´å¾é¿ï¼æ¯ä¸é¦æ¶é´é¿çæäºå
ç§é½æå¯è½ï¼ |
| | | //5ãæ¨éå°ææ¾å¨ |
| | | |
| | | |
| | | //第äºç§ï¼ä½éªææå¾å¥½ï¼ä½åéå°ææ¾çå¯ç æ¯å å¯çï¼éè¦ç®æ³ãå®ç°æè·¯å¦ä¸ï¼ |
| | | //1ãæä»¬Appå
è·åTokenåæ¶é´ |
| | | //2ãç¶åç¨Tidalå¸å·ç´æ¥ç»å½airableæå¡å¨å¹¶åæ¶æç¨æ·ååå¯ç åè¯ææ¾å¨ |
| | | //3ãè·åææ¾å表ï¼ä¸æ¯çå®çææ¾å°åï¼å
³é®ä¿¡æ¯æ¯IDï¼ |
| | | //4ãæ¨éå°ææ¾åè¡¨å°ææ¾å¨ |
| | | |
New file |
| | |
| | | using System;
|
| | | using System.Collections.Generic;
|
| | | using System.Text;
|
| | |
|
| | | namespace Shared.Encryption
|
| | | {
|
| | | public class BASE64
|
| | | {
|
| | | /// <summary>
|
| | | /// å°å符串使ç¨base64ç®æ³å å¯
|
| | | /// </summary>
|
| | | /// <param name="code">å¾
å å¯çå符串</param>
|
| | | /// <returns>å å¯åçå符串</returns>
|
| | | public static string EncodeBase64(string code)
|
| | | {
|
| | | string encode = "";
|
| | | var bytes = Encoding.UTF8.GetBytes(code); //å°ä¸ç»å符ç¼ç 为ä¸ä¸ªåèåºå.
|
| | | try
|
| | | {
|
| | | encode = Convert.ToBase64String(bytes); //å°8使 ç¬¦å·æ´æ°æ°ç»çåé转æ¢ä¸ºå
¶çæç,以64为åºçæ°åç¼ç çå符串形å¼.
|
| | | }
|
| | | catch
|
| | | {
|
| | | encode = code;
|
| | | }
|
| | | return encode;
|
| | | }
|
| | |
|
| | | /// <summary>
|
| | | /// å°å符串使ç¨base64ç®æ³è§£å¯
|
| | | /// </summary>
|
| | | /// <param name="code">å·²ç¨base64ç®æ³å å¯çå符串</param>
|
| | | /// <returns>è§£å¯åçå符串</returns>
|
| | | public static string DecodeBase64(string code)
|
| | | {
|
| | | string decode = ""; |
| | | try
|
| | | {
|
| | | var bytes = Convert.FromBase64String(code); //å°2è¿å¶ç¼ç 转æ¢ä¸º8使 ç¬¦å·æ´æ°æ°ç».
|
| | | decode = Encoding.UTF8.GetString(bytes); //å°æå®åèæ°ç»ä¸çä¸ä¸ªåèåºåè§£ç 为ä¸ä¸ªå符串ã
|
| | | }
|
| | | catch
|
| | | {
|
| | | decode = code;
|
| | | }
|
| | | return decode;
|
| | | }
|
| | | }
|
| | |
|
| | |
|
| | | }
|
| | |
|
| | |
|
New file |
| | |
| | | 
|
| | | 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>.");
|
| | | }
|
| | | }
|
| | |
|
| | |
|
| | |
|
| | |
|
| | |
|
| | | }
|
| | | }
|
| | |
|
| | |
|
New file |
| | |
| | | using System;
|
| | | using System.Text;
|
| | | using System.Security.Cryptography;
|
| | | using System.IO;
|
| | |
|
| | | namespace Shared.Encryption
|
| | | {
|
| | | public class DES
|
| | | {
|
| | | //<summary><![CDATA[å符串DESå å¯å½æ°]]></summary>
|
| | |        //<param name="str"><![CDATA[被å å¯å符串 ]]></param>
|
| | |        //<param name="key"><![CDATA[å¯é¥ ]]></param>Â
|
| | |        //<returns><![CDATA[å å¯åå符串ï¼errorå¼å¤´è¡¨ç¤ºé误]]></returns>  Â
|
| | | Â Â Â Â Â Â Â public static string Encode(string str, string key) |
| | | { |
| | | try |
| | | { |
| | | var provider = new DESCryptoServiceProvider(); |
| | | provider.Key = Encoding.ASCII.GetBytes(key.Substring(0, key.Length < 8 ? key.Length : 8)); |
| | | provider.IV = Encoding.ASCII.GetBytes(key.Substring(0, key.Length < 8 ? key.Length : 8)); |
| | | var bytes = Encoding.UTF8.GetBytes(str);
|
| | | using (var stream = new MemoryStream()) |
| | | { |
| | | var stream2 = new CryptoStream(stream, provider.CreateEncryptor(), CryptoStreamMode.Write); |
| | | stream2.Write(bytes, 0, bytes.Length); |
| | | stream2.FlushFinalBlock(); |
| | | var builder = new StringBuilder(); |
| | | foreach (byte num in stream.ToArray()) |
| | | { |
| | | builder.AppendFormat("{0:X2}", num); |
| | | } |
| | | return builder.ToString();
|
| | | } |
| | | } |
| | | catch (Exception) |
| | | { |
| | | return "error:å å¯å¤±è´¥!"; |
| | | } |
| | | }
|
| | |
|
| | |        //<summary><![CDATA[å符串DESè§£å¯å½æ°]]></summary>
|
| | |        //<param name="str"><![CDATA[被解å¯å符串 ]]></param>
|
| | |        //<param name="key"><![CDATA[å¯é¥ ]]></param>Â
|
| | |        //<returns><![CDATA[è§£å¯åå符串,errorå¼å¤´æ¯åºé]]></returns>  Â
|
| | | public static string Decode(string str, string key)
|
| | | {
|
| | | try
|
| | | {
|
| | | var provider = new DESCryptoServiceProvider();
|
| | | // å¯é¥
|
| | | provider.Key = Encoding.ASCII.GetBytes(key.Substring(0, key.Length < 8 ? key.Length : 8));
|
| | | // åç§»é
|
| | | provider.IV = Encoding.ASCII.GetBytes(key.Substring(0, key.Length < 8 ? key.Length : 8));
|
| | | var buffer = new byte[str.Length / 2];
|
| | | for (int i = 0; i < (str.Length / 2); i++)
|
| | | {
|
| | | int num2 = Convert.ToInt32(str.Substring(i * 2, 2), 0x10);
|
| | | buffer[i] = (byte)num2;
|
| | | }
|
| | | using (var stream = new MemoryStream()) |
| | | { |
| | | var stream2 = new CryptoStream(stream, provider.CreateDecryptor(), CryptoStreamMode.Write); |
| | | stream2.Write(buffer, 0, buffer.Length); |
| | | stream2.FlushFinalBlock(); |
| | | stream.Close(); |
| | | return Encoding.UTF8.GetString(stream.ToArray()); |
| | | }
|
| | | }
|
| | | catch (Exception)
|
| | | { |
| | | return "error:è§£å¯å¤±è´¥!"; |
| | | }
|
| | | }
|
| | | }
|
| | | }
|
New file |
| | |
| | | using System; |
| | | namespace Shared.Encryption |
| | | { |
| | | public class RSA |
| | | { |
| | | /// <summary> |
| | | /// ç¨æå®çå¯åå å¯ |
| | | /// </summary> |
| | | /// <param name="source">ææ</param> |
| | | /// <param name="e">å¯ä»¥æ¯RSACryptoServiceProviderçæçE</param> |
| | | /// <param name="n">å¯ä»¥æ¯RSACryptoServiceProviderçæçModulus</param> |
| | | /// <returns>è¿å坿</returns> |
| | | public static string EncryptString(string source, BigInteger e, BigInteger n) |
| | | { |
| | | int len = source.Length; |
| | | int len1 = 0; |
| | | int blockLen = 0; |
| | | if ((len % 128) == 0) |
| | | len1 = len / 128; |
| | | else |
| | | len1 = len / 128 + 1; |
| | | string block = ""; |
| | | var result = new System.Text.StringBuilder(); |
| | | for (int i = 0; i < len1; i++) |
| | | { |
| | | if (len >= 128) |
| | | blockLen = 128; |
| | | else |
| | | blockLen = len; |
| | | block = source.Substring(i * 128, blockLen); |
| | | byte[] oText = System.Text.Encoding.UTF8.GetBytes(block); |
| | | var biText = new BigInteger(oText); |
| | | var biEnText = biText.modPow(e, n); |
| | | var temp = biEnText.ToHexString(); |
| | | result.Append(temp).Append("@"); |
| | | len -= blockLen; |
| | | } |
| | | return result.ToString().TrimEnd('@'); |
| | | } |
| | | |
| | | } |
| | | } |
New file |
| | |
| | | using System; |
| | | using System.IO; |
| | | |
| | | namespace Shared.IO |
| | | { |
| | | public static class FileUtils |
| | | { |
| | | public static void DeleteFile(string path) |
| | | { |
| | | System.IO.File.Delete(path); |
| | | } |
| | | |
| | | public static System.IO.Stream GetStreamFromResource(string path) |
| | | { |
| | | return Application.Activity.Assets.Open(path); |
| | | } |
| | | |
| | | public static readonly string RootPath = Application.RootPath; |
| | | |
| | | /// <summary> |
| | | /// Writes the file by bytes. |
| | | /// </summary> |
| | | /// <returns><c>true</c>, if file by bytes was writed, <c>false</c> otherwise.</returns> |
| | | /// <param name="fileName">File name.</param> |
| | | /// <param name="bytes">Bytes.</param> |
| | | public static bool WriteFileByBytes(string fileName, byte[] bytes) |
| | | { |
| | | if (fileName == null || (fileName = fileName.Trim()) == ("")) |
| | | { |
| | | return false; |
| | | } |
| | | System.IO.FileStream fs = null; |
| | | |
| | | try |
| | | { |
| | | fs = new FileStream(System.IO.Path.Combine(RootPath, fileName), FileMode.Create, FileAccess.Write); |
| | | fs.Write(bytes, 0, bytes.Length); |
| | | fs.Flush(); |
| | | return true; |
| | | } |
| | | catch |
| | | { |
| | | return false; |
| | | } |
| | | finally |
| | | { |
| | | try |
| | | { |
| | | if (fs != null) |
| | | { |
| | | fs.Close(); |
| | | } |
| | | } |
| | | catch |
| | | { |
| | | } |
| | | } |
| | | |
| | | } |
| | | |
| | | /// <summary> |
| | | /// Writes the file by input stream. |
| | | /// </summary> |
| | | /// <returns><c>true</c>, if file by input stream was writed, <c>false</c> otherwise.</returns> |
| | | /// <param name="fileName">File name.</param> |
| | | /// <param name="inputStream">Input stream.</param> |
| | | /// <param name="isNeedRootPath">If set to <c>true</c> is need root path.</param> |
| | | public static bool WriteFileByInputStream(string fileName, System.IO.Stream inputStream) |
| | | { |
| | | if (fileName == null || (fileName = fileName.Trim()) == ("")) |
| | | { |
| | | return false; |
| | | } |
| | | try |
| | | { |
| | | var fs = new FileStream(System.IO.Path.Combine(RootPath, fileName), FileMode.Create, FileAccess.Write); |
| | | byte[] buffer = new byte[4 * 1024]; |
| | | int length = 0; |
| | | while ((length = inputStream.Read(buffer, 0, buffer.Length)) != 0) |
| | | { |
| | | fs.Write(buffer, 0, length); |
| | | fs.Flush(); |
| | | } |
| | | fs.Close(); |
| | | |
| | | System.Console.WriteLine(fileName); |
| | | return true; |
| | | } |
| | | catch |
| | | { |
| | | return false; |
| | | } |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 读åå¾çæä»¶è·¯å¾ |
| | | /// </summary> |
| | | /// <returns>The file.</returns> |
| | | /// <param name="fileName">File name.</param> |
| | | public static string GetImageFilePath(string fileName) |
| | | { |
| | | if (fileName == null) |
| | | { |
| | | return ""; |
| | | } |
| | | |
| | | if (System.IO.File.Exists( fileName)) |
| | | { |
| | | return fileName; |
| | | } |
| | | |
| | | // å
æ¾æ¯å¦æ¯ç¨æ·å·²ç»æ´æ¹è¿çå¾çï¼è¿ä¸ªæ¯ä¼å
éæ© |
| | | if (System.IO.File.Exists(System.IO.Path.Combine(Application.RootPath, fileName))) |
| | | { |
| | | return System.IO.Path.Combine(Application.RootPath, fileName); |
| | | } |
| | | |
| | | string newFileName = null; |
| | | if (Application.Skin == null) |
| | | { |
| | | newFileName = "Phone/" + fileName; |
| | | } |
| | | else |
| | | { |
| | | newFileName = Application.Skin + "/" + fileName; |
| | | } |
| | | |
| | | //data ç®å½ä¸æ¥æ¾ ï¼æå¯è½æ¯å¤ç®è¤çæ°æ® |
| | | if (System.IO.File.Exists(System.IO.Path.Combine(Application.RootPath, newFileName))) |
| | | { |
| | | return System.IO.Path.Combine(Application.RootPath, newFileName); |
| | | } |
| | | |
| | | return ""; |
| | | } |
| | | |
| | | /// <summary> |
| | | /// read file |
| | | /// </summary> |
| | | /// <returns>The file.</returns> |
| | | /// <param name="fileName">File name.</param> |
| | | public static byte[] ReadImage11111(string fileName) |
| | | { |
| | | string tempFileName = fileName; |
| | | { |
| | | fileName = "Phone/" + fileName; |
| | | } |
| | | System.IO.FileStream fs = null; |
| | | try |
| | | { |
| | | if (System.IO.File.Exists(System.IO.Path.Combine(RootPath, tempFileName))) |
| | | { |
| | | fs = new FileStream(System.IO.Path.Combine(RootPath, tempFileName), FileMode.Open, FileAccess.Read); |
| | | } |
| | | else if (System.IO.File.Exists(fileName)) |
| | | { |
| | | fs = new FileStream(fileName, FileMode.Open, FileAccess.Read); |
| | | } |
| | | else |
| | | { |
| | | return new byte[0]; |
| | | } |
| | | byte[] bytes = new byte[fs.Length]; |
| | | fs.Read(bytes, 0, bytes.Length); |
| | | return bytes; |
| | | } |
| | | catch |
| | | { |
| | | return new byte[0]; |
| | | } |
| | | finally |
| | | { |
| | | try |
| | | { |
| | | if (fs != null) |
| | | { |
| | | fs.Close(); |
| | | } |
| | | } |
| | | catch |
| | | { |
| | | |
| | | } |
| | | } |
| | | } |
| | | |
| | | public static System.Collections.Generic.List<string> ReadStringList(string fileName, System.Text.Encoding encoding) |
| | | { |
| | | System.Collections.Generic.List<string> stringList = new System.Collections.Generic.List<string>(); |
| | | System.IO.StreamReader fs = null; |
| | | try |
| | | { |
| | | if (System.IO.File.Exists(System.IO.Path.Combine(RootPath, fileName))) |
| | | { |
| | | fs = new StreamReader(System.IO.Path.Combine(RootPath, fileName), encoding); |
| | | } |
| | | else if (System.IO.File.Exists(fileName)) |
| | | { |
| | | fs = new StreamReader(fileName, encoding); |
| | | } |
| | | else |
| | | { |
| | | return stringList; |
| | | } |
| | | string s; |
| | | while (null != (s = fs.ReadLine())) |
| | | { |
| | | stringList.Add(s); |
| | | } |
| | | return stringList; |
| | | } |
| | | catch |
| | | { |
| | | return stringList; |
| | | } |
| | | finally |
| | | { |
| | | if (fs != null) |
| | | { |
| | | fs.Close(); |
| | | } |
| | | } |
| | | } |
| | | |
| | | public static byte[] ReadFile(string fileName) |
| | | { |
| | | System.IO.FileStream fs = null; |
| | | try |
| | | { |
| | | if (System.IO.File.Exists(System.IO.Path.Combine(RootPath, fileName))) |
| | | { |
| | | fs = new FileStream(System.IO.Path.Combine(RootPath, fileName), FileMode.Open, FileAccess.Read); |
| | | } |
| | | else if (System.IO.File.Exists(fileName)) |
| | | { |
| | | fs = new FileStream(fileName, FileMode.Open, FileAccess.Read); |
| | | } |
| | | else |
| | | { |
| | | return new byte[0]; |
| | | } |
| | | byte[] bytes = new byte[fs.Length]; |
| | | fs.Read(bytes, 0, bytes.Length); |
| | | return bytes; |
| | | } |
| | | catch |
| | | { |
| | | return new byte[0]; |
| | | } |
| | | finally |
| | | { |
| | | if (fs != null) |
| | | { |
| | | fs.Close(); |
| | | } |
| | | |
| | | } |
| | | } |
| | | } |
| | | } |
| | | |
New file |
| | |
| | | This directory is for Android .jars. |
| | | |
| | | There are 4 types of jars that are supported: |
| | | |
| | | == Input Jar and Embedded Jar == |
| | | |
| | | This is the jar that bindings should be generated for. |
| | | |
| | | For example, if you were binding the Google Maps library, this would |
| | | be Google's "maps.jar". |
| | | |
| | | The difference between EmbeddedJar and InputJar is, EmbeddedJar is to be |
| | | embedded in the resulting dll as EmbeddedResource, while InputJar is not. |
| | | There are couple of reasons you wouldn't like to embed the target jar |
| | | in your dll (the ones that could be internally loaded by <uses-library> |
| | | feature e.g. maps.jar, or you cannot embed jars that are under some |
| | | proprietary license). |
| | | |
| | | Set the build action for these jars in the properties page to "InputJar". |
| | | |
| | | |
| | | == Reference Jar and Embedded Reference Jar == |
| | | |
| | | These are jars that are referenced by the input jar. C# bindings will |
| | | not be created for these jars. These jars will be used to resolve |
| | | types used by the input jar. |
| | | |
| | | NOTE: Do not add "android.jar" as a reference jar. It will be added automatically |
| | | based on the Target Framework selected. |
| | | |
| | | Set the build action for these jars in the properties page to "ReferenceJar". |
| | | |
| | | "EmbeddedJar" works like "ReferenceJar", but like "EmbeddedJar", it is |
| | | embedded in your dll. But at application build time, they are not included |
| | | in the final apk, like ReferenceJar files. |
| | | |
| | | |
New file |
| | |
| | | using System; |
| | | using Android.App; |
| | | using Android.Content; |
| | | using Android.Net; |
| | | using Android.Telephony; |
| | | |
| | | namespace Shared |
| | | { |
| | | public class MyBroadcastReceive : BroadcastReceiver |
| | | { |
| | | /// <summary> |
| | | /// åéäºä»¶ |
| | | /// </summary> |
| | | public static Action ActioRinging; |
| | | /// <summary> |
| | | /// çµè¯ææäºä»¶ |
| | | /// </summary> |
| | | public static Action ActionIdle; |
| | | /// <summary> |
| | | /// æ¯å¦å¨éè¯ä¸ |
| | | /// </summary> |
| | | public static bool IsCalling; |
| | | public override void OnReceive (Context context, Intent intent) |
| | | { |
| | | //return; |
| | | System.Console.WriteLine ($"æ¥æ¶å°å¹¿æäºï¼{intent.Action}"); |
| | | switch (intent.Action) { |
| | | // å¦ææ¯æ¨æçµè¯ |
| | | case "android.intent.action.NEW_OUTGOING_CALL": { |
| | | System.Console.WriteLine ($"ææçµè¯->{intent.GetStringExtra (Intent.ExtraPhoneNumber)}"); |
| | | } |
| | | break; |
| | | //被æçµè¯ |
| | | case "android.intent.action.PHONE_STATE": { |
| | | // å¦ææ¯æ¥çµ |
| | | var tManager = (TelephonyManager)context.GetSystemService (Service.TelephonyService); |
| | | System.Console.WriteLine ($"éè¯ç¶æ->{tManager.CallState}"); |
| | | switch (tManager.CallState) { |
| | | //åé |
| | | case CallState.Ringing: |
| | | IsCalling = true; |
| | | var mIncomingNumber = intent.GetStringExtra ("incoming_number"); |
| | | ActioRinging?.Invoke (); |
| | | break; |
| | | //æ¥é |
| | | case CallState.Offhook: |
| | | IsCalling = true; |
| | | ActioRinging?.Invoke (); |
| | | break; |
| | | //ææçµè¯ |
| | | case CallState.Idle: |
| | | IsCalling = false; |
| | | ActionIdle?.Invoke (); |
| | | break; |
| | | } |
| | | break; |
| | | } |
| | | case "android.net.conn.CONNECTIVITY_CHANGE": |
| | | if (intent.Extras != null) { |
| | | var ni = (NetworkInfo)intent.Extras.Get (ConnectivityManager.ExtraNetworkInfo); |
| | | if (ni != null && ni.GetState () == NetworkInfo.State.Connected) { |
| | | //å¯ä»¥åè¿éè¿è¡ä¸äºç½ç»çªç¶æå¼æªå®æçæä½ |
| | | System.Console.WriteLine ($"ç½ç»åå:{ni.GetState ()}"); |
| | | var type = getConnectedType (context); |
| | | if (type == 2) |
| | | { |
| | | Application.IsWifi = true; |
| | | } |
| | | else { |
| | | Application.IsWifi = false; |
| | | } |
| | | BaseActivity.NetworkStateChanged?.Invoke (type); |
| | | } |
| | | } |
| | | break; |
| | | } |
| | | } |
| | | |
| | | int getConnectedType (Context context) |
| | | { |
| | | if (context != null) { |
| | | var mConnectivityManager = (ConnectivityManager)context.GetSystemService (Context.ConnectivityService); |
| | | if (mConnectivityManager == null) { |
| | | return 0; |
| | | } |
| | | var mNetworkInfo = mConnectivityManager.ActiveNetworkInfo; |
| | | if (mNetworkInfo != null && mNetworkInfo.IsAvailable) { |
| | | switch (mNetworkInfo.Type) { |
| | | case ConnectivityType.Mobile: |
| | | return 1; |
| | | case ConnectivityType.Wifi: |
| | | return 2; |
| | | } |
| | | } |
| | | } |
| | | return 0; |
| | | } |
| | | |
| | | } |
| | | } |
New file |
| | |
| | | using System; |
| | | using Android; |
| | | using Android.App; |
| | | using Android.Content; |
| | | using Android.Content.PM; |
| | | using Android.Locations; |
| | | using Android.OS; |
| | | using Android.Runtime; |
| | | using Android.Widget; |
| | | |
| | | namespace Shared |
| | | { |
| | | /// <summary> |
| | | /// GPS åå°å®ä½ |
| | | /// </summary> |
| | | [Service] |
| | | public class GPSLocationService:Service |
| | | { |
| | | public override IBinder OnBind(Intent intent) |
| | | { |
| | | return null; |
| | | } |
| | | |
| | | public override void OnCreate() |
| | | { |
| | | base.OnCreate(); |
| | | if (BaseActivity.IsEnnableGPS) |
| | | { |
| | | (Shared.Application.Activity as BaseActivity).SetGPSLocationPermission(result => |
| | | { |
| | | if (result) |
| | | { |
| | | initLocation(); |
| | | notification(); |
| | | } |
| | | }); |
| | | } |
| | | } |
| | | |
| | | [Obsolete] |
| | | void notification() |
| | | { |
| | | if (Android.OS.Build.VERSION.SdkInt >= BuildVersionCodes.O) |
| | | { |
| | | var mNotificationUtils = new NotificationUtils(this); |
| | | var notificationIntent = new Intent(this, typeof(BaseActivity)); |
| | | var pendingIntent = PendingIntent.GetActivity(this, 3, |
| | | notificationIntent, PendingIntentFlags.CancelCurrent); |
| | | |
| | | var builder = mNotificationUtils.getAndroidChannelNotification |
| | | (Language.CurrentLanguage == "Chinese"?"è·åå®ä½ä¿¡æ¯":"Get Location Information", "", pendingIntent); |
| | | StartForeground(1, builder.Build());//id must not be 0,å³ç¦æ¢æ¯0 |
| | | } |
| | | } |
| | | |
| | | class NotificationUtils :Notification.Builder |
| | | { |
| | | |
| | | private NotificationManager mManager; |
| | | public static string channelId = "85521566"; |
| | | public static string channelName = "HDLChanneName"; |
| | | private Context context; |
| | | |
| | | [Obsolete] |
| | | public NotificationUtils(Context context) : base(context) |
| | | { |
| | | this.context = context; |
| | | createChannels(); |
| | | } |
| | | |
| | | public void createChannels() |
| | | { |
| | | // create android channel |
| | | if (Android.OS.Build.VERSION.SdkInt >= BuildVersionCodes.O) |
| | | { |
| | | var androidChannel = new NotificationChannel(channelId, |
| | | context.PackageName, NotificationImportance.High); |
| | | // Sets whether notifications posted to this channel should display notification lights |
| | | androidChannel.EnableLights(false); |
| | | // Sets whether notification posted to this channel should vibrate. |
| | | androidChannel.EnableVibration(false); |
| | | androidChannel.SetVibrationPattern(new long[] { 0 }); |
| | | // Sets the notification light color for notifications posted to this channel |
| | | androidChannel.LightColor = 0x38FF1234; |
| | | // Sets whether notifications posted to this channel appear on the lockscreen or not |
| | | androidChannel.LockscreenVisibility = NotificationVisibility.Private; |
| | | |
| | | getManager().CreateNotificationChannel(androidChannel); |
| | | } |
| | | |
| | | } |
| | | |
| | | private NotificationManager getManager() |
| | | { |
| | | if (mManager == null) |
| | | { |
| | | mManager = (NotificationManager)context.GetSystemService(NotificationService); |
| | | } |
| | | return mManager; |
| | | } |
| | | |
| | | public Notification.Builder getAndroidChannelNotification(string title, string body, PendingIntent pendingIntent) |
| | | { |
| | | if (Android.OS.Build.VERSION.SdkInt >= BuildVersionCodes.O) |
| | | { |
| | | return new Notification.Builder(context, channelId) |
| | | .SetContentTitle(title) |
| | | .SetContentText(body) |
| | | .SetContentIntent(pendingIntent) |
| | | .SetSmallIcon(Android.Graphics.Drawables.Icon.CreateWithBitmap( ((Android.Graphics.Drawables.BitmapDrawable)context.PackageManager.GetApplicationIcon(context.PackageManager.GetApplicationInfo(context.PackageName,0))).Bitmap))//android.R.drawable.stat_notify_more |
| | | //.SetWhen(System.DateTime.Now.Ticks) |
| | | .SetOngoing(true) |
| | | .SetChannelId(channelId) |
| | | .SetAutoCancel(true); |
| | | |
| | | } |
| | | else |
| | | { |
| | | return new Notification.Builder(context, channelId); |
| | | } |
| | | |
| | | } |
| | | } |
| | | |
| | | |
| | | #region GPSå®ä½ |
| | | |
| | | LocationManager locationManager; |
| | | /// <summary> |
| | | /// åå§åå®ä½æå¡ |
| | | /// </summary> |
| | | void initLocation() |
| | | { |
| | | //GPSåå§å |
| | | locationManager = GetSystemService(LocationService).JavaCast<LocationManager>(); |
| | | // 夿GPSæ¯å¦æ£å¸¸å¯å¨ |
| | | if (!locationManager.IsProviderEnabled(LocationManager.GpsProvider)) |
| | | { |
| | | if (Language.CurrentLanguage == "Chinese") |
| | | { |
| | | Toast.MakeText(this, "请æå¼GPS...", ToastLength.Long).Show(); |
| | | } |
| | | else |
| | | { |
| | | Toast.MakeText(this, "Please open GPS...", ToastLength.Long).Show(); |
| | | } |
| | | } |
| | | else |
| | | { |
| | | locationManager.RequestLocationUpdates(LocationManager.GpsProvider, 60 * 1000, 1000, new locationChange { }); |
| | | } |
| | | } |
| | | |
| | | class locationChange : Java.Lang.Object, Android.Locations.ILocationListener |
| | | { |
| | | public void OnLocationChanged(Location location) |
| | | { |
| | | Shared.Application.LocationAction?.Invoke(location.Longitude, location.Latitude); |
| | | } |
| | | |
| | | public void OnProviderDisabled(string provider) |
| | | { |
| | | } |
| | | |
| | | public void OnProviderEnabled(string provider) |
| | | { |
| | | } |
| | | |
| | | public void OnStatusChanged(string provider, [GeneratedEnum] Availability status, Bundle extras) |
| | | { |
| | | } |
| | | } |
| | | |
| | | public void OnLocationChanged(Location location) |
| | | { |
| | | } |
| | | |
| | | public void OnProviderDisabled(string provider) |
| | | { |
| | | |
| | | } |
| | | |
| | | public void OnProviderEnabled(string provider) |
| | | { |
| | | |
| | | } |
| | | |
| | | public void OnStatusChanged(string provider, [GeneratedEnum] Availability status, Bundle extras) |
| | | { |
| | | |
| | | } |
| | | #endregion |
| | | |
| | | public override StartCommandResult OnStartCommand(Intent intent, [GeneratedEnum] StartCommandFlags flags, int startId) |
| | | { |
| | | return StartCommandResult.Sticky; |
| | | } |
| | | } |
| | | } |
New file |
| | |
| | | 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; |
| | | } |
| | | } |
| | | |
| | | |
| | | } |
New file |
| | |
| | | using System; |
| | | using Android.Content; |
| | | using Android.Net.Wifi; |
| | | |
| | | namespace Shared.Net |
| | | { |
| | | public class WifiUtil |
| | | { |
| | | /* |
| | | * 忢尿å®wifi |
| | | * @param wifiName æå®çwifiåå |
| | | * @param wifiPwd wifiå¯ç ï¼å¦æå·²ç»ä¿åè¿å¯ç ï¼å¯ä»¥ä¼ å
¥null |
| | | * @return |
| | | */ |
| | | public void ConnectToWifi (Action<bool> action, string wifiName, string wifiPwd = null) |
| | | { |
| | | bool result = false; |
| | | try { |
| | | string tempWifiName = "\"" + wifiName + "\""; |
| | | // 妿wifiæé没æå¼ï¼1ãå
æå¼wifiï¼2ï¼ä½¿ç¨æå®çwifi |
| | | if (!mWifiManager.IsWifiEnabled) { |
| | | if (!mWifiManager.SetWifiEnabled (true)) { |
| | | return; |
| | | } |
| | | } |
| | | var wifiList = mWifiManager.ConfiguredNetworks; |
| | | var bFindInList = false; |
| | | for (int i = 0; i < wifiList.Count; i++) { |
| | | var wifiInfo0 = wifiList [i]; |
| | | // å
æ¾å°å¯¹åºçwifi |
| | | if (tempWifiName == (wifiInfo0.Ssid) || wifiName == (wifiInfo0.Ssid)) { |
| | | bFindInList = true; |
| | | // 1ã å
å¯å¨ï¼å¯è½å·²ç»è¾å
¥è¿å¯ç ï¼å¯ä»¥ç´æ¥å¯å¨ |
| | | result = doChange2Wifi (wifiInfo0.NetworkId); |
| | | } |
| | | } |
| | | // 2ã妿wifiè¿æ²¡æè¾å
¥è¿å¯ç ï¼å°è¯è¾å
¥å¯ç ï¼å¯å¨wifi |
| | | if (!bFindInList) { |
| | | var wifiNewConfiguration = createWifiInfo (wifiName, wifiPwd);//使ç¨wpa2çwifiå 坿¹å¼ |
| | | int newNetworkId = mWifiManager.AddNetwork (wifiNewConfiguration); |
| | | if (newNetworkId == -1) { |
| | | //Log.e (TAG, "æä½å¤±è´¥,éè¦æ¨å°ææºwifiå表ä¸åæ¶å¯¹è®¾å¤è¿æ¥çä¿å"); |
| | | } else { |
| | | result = doChange2Wifi (newNetworkId); |
| | | } |
| | | } |
| | | } catch { } finally { |
| | | if (action != null) |
| | | action (result); |
| | | } |
| | | } |
| | | |
| | | bool doChange2Wifi (int newNetworkId) |
| | | { |
| | | var enableNetwork = mWifiManager.EnableNetwork (newNetworkId, true); |
| | | if (!enableNetwork) { |
| | | //"忢尿å®wifi失败"; |
| | | return false; |
| | | } else { |
| | | // "忢尿å®wifiæå"; |
| | | return true; |
| | | } |
| | | } |
| | | |
| | | /* |
| | | * å建 WifiConfigurationï¼è¿éåå»ºçæ¯wpa2å 坿¹å¼çwifi |
| | | * @param ssid wifiè´¦å· |
| | | * @param password wifiå¯ç |
| | | * @return |
| | | */ |
| | | WifiConfiguration createWifiInfo (string ssid, string password) |
| | | { |
| | | var config = new WifiConfiguration (); |
| | | config.AllowedAuthAlgorithms.Clear (); |
| | | config.AllowedGroupCiphers.Clear (); |
| | | config.AllowedKeyManagement.Clear (); |
| | | config.AllowedPairwiseCiphers.Clear (); |
| | | config.AllowedProtocols.Clear (); |
| | | config.Ssid = "\"" + ssid + "\""; |
| | | config.PreSharedKey = "\"" + password + "\""; |
| | | config.AllowedAuthAlgorithms.Set ((int)WifiConfiguration.AuthAlgorithm.Open); |
| | | config.AllowedGroupCiphers.Set ((int)WifiConfiguration.GroupCipher.Tkip); |
| | | config.AllowedGroupCiphers.Set ((int)WifiConfiguration.GroupCipher.Ccmp); |
| | | config.AllowedKeyManagement.Set ((int)WifiConfiguration.KeyMgmt.WpaPsk); |
| | | config.AllowedPairwiseCiphers.Set ((int)WifiConfiguration.PairwiseCipher.Tkip); |
| | | config.AllowedPairwiseCiphers.Set ((int)WifiConfiguration.PairwiseCipher.Ccmp); |
| | | config.AllowedProtocols.Set ((int)WifiConfiguration.Protocol.Rsn); |
| | | config.AllowedProtocols.Set ((int)WifiConfiguration.Protocol.Wpa); |
| | | config.StatusField = WifiStatus.Enabled; |
| | | return config; |
| | | } |
| | | |
| | | WifiManager mWifiManager; |
| | | |
| | | // åä¾ |
| | | static WifiUtil ourInstance = new WifiUtil (); |
| | | |
| | | public static WifiUtil Instance { |
| | | get { |
| | | if (ourInstance.mWifiManager == null) { |
| | | ourInstance.mWifiManager = (WifiManager)Shared.Application.Activity.GetSystemService (Context.WifiService); |
| | | } |
| | | return ourInstance; |
| | | } |
| | | } |
| | | } |
| | | } |
New file |
| | |
| | | using System; |
| | | |
| | | namespace Shared |
| | | { |
| | | |
| | | internal static class DensityUtil { |
| | | /// <summary> |
| | | /// æ ¹æ®ææºçå辨çä» dp çåä½ è½¬æä¸º px(åç´ ) |
| | | /// </summary> |
| | | /// <returns>The px.</returns> |
| | | /// <param name="dpValue">Dp value.</param> |
| | | public static int Dip2Px(float dpValue) { |
| | | float scale = Application.Activity.Resources.DisplayMetrics.Density; |
| | | // scale = context.Resources.DisplayMetrics.Density; |
| | | return (int) (dpValue * scale + 0.5f); |
| | | } |
| | | |
| | | |
| | | /// <summary> |
| | | /// æ ¹æ®ææºçå辨çä» px(åç´ ) çåä½ è½¬æä¸º dp |
| | | /// </summary> |
| | | /// <returns>The dip.</returns> |
| | | /// <param name="pxValue">Px value.</param> |
| | | public static int Px2Dip(float pxValue) { |
| | | float scale = Application.Activity.Resources.DisplayMetrics.Density; |
| | | return (int) (pxValue / scale + 0.5f); |
| | | } |
| | | } |
| | | } |
| | | |
New file |
| | |
| | | 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; |
| | | } |
| | | } |
New file |
| | |
| | | using System; |
| | | using System.Collections.Generic; |
| | | using System.Linq; |
| | | using System.Text; |
| | | |
| | | using Android.App; |
| | | using Android.Content; |
| | | using Android.OS; |
| | | using Android.Runtime; |
| | | using Android.Views; |
| | | using Android.Widget; |
| | | using Android.Net.Wifi; |
| | | using com.hdl.on; |
| | | |
| | | namespace Shared.Other |
| | | { |
| | | [Service] |
| | | public class MusicService : Service |
| | | { |
| | | /// <summary> |
| | | /// æ¬å°é³ä¹ççå¬æå¡ |
| | | /// </summary> |
| | | private Server server; |
| | | /// <summary> |
| | | /// æ¯å¦æ£å¨è¿è¡ |
| | | /// </summary> |
| | | private bool isRunning = false; |
| | | public override IBinder OnBind (Intent intent) |
| | | { |
| | | return null; |
| | | } |
| | | public override void OnCreate () |
| | | { |
| | | base.OnCreate (); |
| | | startServer (); |
| | | } |
| | | |
| | | public override void OnDestroy () |
| | | { |
| | | base.OnDestroy (); |
| | | stopServer (); |
| | | } |
| | | /// <summary> |
| | | /// WebServer æ¬å°è·¯å¾ |
| | | /// </summary> |
| | | /// <value>The get document root.</value> |
| | | string documentRoot => Android.OS.Environment.ExternalStorageDirectory.AbsolutePath + "/WebServer/"; |
| | | /// <summary> |
| | | /// åå§åWebServerçè·¯å¾ |
| | | /// </summary> |
| | | void initDocumentRoot () |
| | | { |
| | | try { |
| | | if (!(new Java.IO.File (documentRoot)).Exists ()) { |
| | | new Java.IO.File (documentRoot).Mkdir (); |
| | | var bout = new Java.IO.BufferedWriter (new Java.IO.FileWriter (documentRoot + "index.html")); |
| | | bout.Write ("<html><head><title>Android Webserver</title>"); |
| | | bout.Write ("</head>"); |
| | | bout.Write ("<body>Willkommen auf dem Android Webserver."); |
| | | bout.Write ("<br><br>Die HTML-Dateien liegen in " + documentRoot + ", der Sourcecode dieser App auf "); |
| | | bout.Write ("<a href=\"https://github.com/bodeme/androidwebserver\">Github</a>"); |
| | | bout.Write ("</body></html>"); |
| | | bout.Flush (); |
| | | bout.Close (); |
| | | bout = new Java.IO.BufferedWriter (new Java.IO.FileWriter (documentRoot + "403.html")); |
| | | bout.Write ("<html><head><title>Error 403</title>"); |
| | | bout.Write ("</head>"); |
| | | bout.Write ("<body>403 - Forbidden</body></html>"); |
| | | bout.Flush (); |
| | | bout.Close (); |
| | | bout = new Java.IO.BufferedWriter (new Java.IO.FileWriter (documentRoot + "404.html")); |
| | | bout.Write ("<html><head><title>Error 404</title>"); |
| | | bout.Write ("</head>"); |
| | | bout.Write ("<body>404 - File not found</body></html>"); |
| | | bout.Flush (); |
| | | bout.Close (); |
| | | } |
| | | } catch (Exception e) { |
| | | Android.Util.Log.Verbose ("ERROR", e.Message); |
| | | } |
| | | } |
| | | |
| | | void startServer() |
| | | { |
| | | try { |
| | | if(isRunning){ |
| | | return; |
| | | } |
| | | isRunning = true; |
| | | initDocumentRoot (); |
| | | server = new Server (documentRoot, ApplicationContext); |
| | | server.Start (); |
| | | } |
| | | catch (Exception e) |
| | | { |
| | | isRunning = false; |
| | | } |
| | | } |
| | | |
| | | void stopServer () |
| | | { |
| | | try { |
| | | if (null != server) { |
| | | server.stopServer (); |
| | | server.Interrupt (); |
| | | isRunning = false; |
| | | } |
| | | } catch { } |
| | | } |
| | | } |
| | | } |
New file |
| | |
| | | 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); |
| | | } |
| | | } |
| | | } |
New file |
| | |
| | | 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"; |
| | | } |
| | | } |
| | | } |
New file |
| | |
| | | using System; |
| | | using Android.Content; |
| | | using Android.Media; |
| | | |
| | | namespace com.hdl.on |
| | | { |
| | | public static class Volume |
| | | { |
| | | /// <summary> |
| | | /// é³éååäºä»¶ |
| | | /// </summary> |
| | | public static Action<int> VolumeChange; |
| | | /// <summary> |
| | | /// æ¯å¦éè¦æ´æ°å½åé³é |
| | | /// </summary> |
| | | static bool isNeedUpdate = true; |
| | | /// <summary> |
| | | /// 设置å½åé³é |
| | | /// </summary> |
| | | /// <param name="volume">Volume.</param> |
| | | public static int MusicVolume { |
| | | set { |
| | | if (!isNeedUpdate) { |
| | | return; |
| | | } |
| | | isNeedUpdate = false; |
| | | AudioManager audioManager = (AudioManager)Shared.Application.Activity.GetSystemService (Context.AudioService); |
| | | float tempVolume = value / 100.0f * audioManager.GetStreamMaxVolume (Stream.Music); |
| | | audioManager.SetStreamVolume (Stream.Music, (int)tempVolume, 0); |
| | | } |
| | | } |
| | | /// <summary> |
| | | /// åå§åå½åé³éææ¾ç±»åæ¯åªä½ |
| | | /// </summary> |
| | | public static void Init () |
| | | { |
| | | Shared.Application.Activity.VolumeControlStream = Stream.Music; |
| | | } |
| | | } |
| | | } |
New file |
| | |
| | | using System.Reflection; |
| | | using System.Runtime.CompilerServices; |
| | | using Android.App; |
| | | |
| | | // Information about this assembly is defined by the following attributes. |
| | | // Change them to the values specific to your project. |
| | | |
| | | [assembly: AssemblyTitle("Shared.Droid")] |
| | | [assembly: AssemblyDescription("")] |
| | | [assembly: AssemblyConfiguration("")] |
| | | [assembly: AssemblyCompany("")] |
| | | [assembly: AssemblyProduct("")] |
| | | [assembly: AssemblyCopyright("hdl")] |
| | | [assembly: AssemblyTrademark("")] |
| | | [assembly: AssemblyCulture("")] |
| | | |
| | | // The assembly version has the format "{Major}.{Minor}.{Build}.{Revision}". |
| | | // The form "{Major}.{Minor}.*" will automatically update the build and revision, |
| | | // and "{Major}.{Minor}.{Build}.*" will update just the revision. |
| | | |
| | | [assembly: AssemblyVersion("1.0.2.0")] |
| | | |
| | | // The following attributes are used to specify the signing key for the assembly, |
| | | // if desired. See the Mono documentation for more information about signing. |
| | | |
| | | //[assembly: AssemblyDelaySign(false)] |
| | | //[assembly: AssemblyKeyFile("")] |
| | | |
New file |
| | |
| | | <?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> |
New file |
| | |
| | |
|
| | | 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
|
New file |
| | |
| | | using System; |
| | | using System.Collections.Generic; |
| | | using Android.Animation; |
| | | using Android.App; |
| | | using Android.Content; |
| | | using Android.Graphics; |
| | | using Android.Graphics.Drawables; |
| | | using Android.OS; |
| | | using Android.Runtime; |
| | | using Android.Views; |
| | | using Android.Views.Animations; |
| | | using Java.Lang; |
| | | |
| | | namespace Shared.Droid |
| | | { |
| | | //[Activity (MainLauncher = false)] |
| | | public class SplashActivity : Android.App.Activity |
| | | { |
| | | protected override void OnCreate(Bundle savedInstanceState) |
| | | { |
| | | base.OnCreate(savedInstanceState); |
| | | //new Handler ().PostDelayed (() => { |
| | | // var mainIntent = new Android.Content.Intent(this,typeof()) |
| | | // //SplashActivity.this. (mainIntent); |
| | | // //SplashActivity.this.Finish (); |
| | | //}, 100); |
| | | //var contentView= new MyJar.LoadingView (this, 2130837756, 2130837756, 2130837756); |
| | | //contentView.SetLoadingRenderer (new MyJar.ElectricFanLoadingRenderer (this, 2130837756, 2130837756, 2130837756)); |
| | | //SetContentView (contentView); |
| | | |
| | | } |
| | | |
| | | } |
| | | } |
New file |
| | |
| | | <?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> |
New file |
| | |
| | | <?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> |
New file |
| | |
| | | <?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> |
New file |
| | |
| | | using System; |
| | | using Android; |
| | | using Android.App; |
| | | using Android.Content; |
| | | using Android.Views; |
| | | |
| | | namespace Shared |
| | | { |
| | | /// <summary> |
| | | /// å¯¹è¯æ¡ |
| | | /// </summary> |
| | | /// 2019--18 ä¿®æ¹ |
| | | public class Alert |
| | | { |
| | | /// <summary> |
| | | /// å½åä¿¡æ¯æ¡å¯¹è±¡ |
| | | /// </summary> |
| | | AlertDialog.Builder builder; |
| | | |
| | | AlertDialog mAlertDialog; |
| | | |
| | | /// <summary> |
| | | /// 对è¯çª |
| | | /// </summary> |
| | | /// <param name="title">æ é¢</param> |
| | | /// <param name="message">ä¿¡æ¯</param> |
| | | /// <param name="cancelButtonText">åæ¶æé®å¤æ³¨ï¼å¼nullè¡¨ç¤ºä¸æ¾ç¤ºåæ¶æé®</param> |
| | | /// <param name="okButtonText">确认æé®å¤æ³¨</param> |
| | | public Alert (string title, string message, string cancelButtonText, string okButtonText) |
| | | { |
| | | //builder = new AlertDialog.Builder(Application.Activity); |
| | | builder = new AlertDialog.Builder(new ContextThemeWrapper(Application.Activity, Resource.Style.ThemeDeviceDefaultLight));//æ¹ä¸ºæµ
è²ä¸»é¢ |
| | | |
| | | builder.SetMessage (message); |
| | | builder.SetTitle (title); |
| | | builder.SetCancelable (false); |
| | | builder.SetPositiveButton (okButtonText, new EventHandler<DialogClickEventArgs> ((sender, e) => { |
| | | ResultEventHandler?.Invoke(this, true); |
| | | })); |
| | | |
| | | if (cancelButtonText != null) { |
| | | builder.SetNegativeButton (cancelButtonText, new EventHandler<DialogClickEventArgs> ((sender, e) => { |
| | | ResultEventHandler?.Invoke(this, false); |
| | | })); |
| | | } |
| | | |
| | | mAlertDialog = builder.Create(); |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 对è¯çª |
| | | /// </summary> |
| | | /// <param name="title">æ é¢</param> |
| | | /// <param name="message">ä¿¡æ¯</param> |
| | | /// <param name="okButtonText">确认æé®å¤æ³¨</param> |
| | | public Alert (string title, string message, string okButtonText) : this (title, message, null, okButtonText) { } |
| | | |
| | | /// <summary> |
| | | /// ç»æéç¥äºä»¶ï¼true表示é䏿é®ï¼falseè¡¨ç¤ºåæ¶äºä»¶ |
| | | /// </summary> |
| | | public Action<Alert, bool> ResultEventHandler; |
| | | |
| | | /// <summary> |
| | | /// æ¾ç¤ºå½åççé¢ |
| | | /// </summary> |
| | | public void Show() |
| | | { |
| | | if (mAlertDialog != null) |
| | | { |
| | | if (mAlertDialog.IsShowing) |
| | | { |
| | | mAlertDialog.Dismiss(); |
| | | } |
| | | |
| | | mAlertDialog.Show(); |
| | | } |
| | | |
| | | } |
| | | |
| | | |
| | | /// <summary> |
| | | /// å
³éå½åççé¢ |
| | | /// </summary> |
| | | public void Dismiss() |
| | | { |
| | | if (mAlertDialog != null && mAlertDialog.IsShowing) |
| | | { |
| | | mAlertDialog.Dismiss(); |
| | | } |
| | | |
| | | } |
| | | |
| | | |
| | | |
| | | } |
| | | } |
| | | |
New file |
| | |
| | | using System; |
| | | using Android.Graphics.Drawables; |
| | | using Android.Graphics; |
| | | using Android.Telephony; |
| | | using Android.Content; |
| | | |
| | | namespace Shared |
| | | { |
| | | /// <summary> |
| | | /// UIå¤çç±» |
| | | /// </summary> |
| | | public class Application |
| | | { |
| | | /// <summary> |
| | | /// è·åå®é
çé«åº¦ |
| | | /// </summary> |
| | | /// <returns>The real height.</returns> |
| | | /// <param name="height">Height.</param> |
| | | public static int GetRealHeight(int height) |
| | | { |
| | | return (int)(height / HeightScale); |
| | | } |
| | | /// <summary> |
| | | /// é»è®¤çåä½å¤§å° |
| | | /// </summary> |
| | | public static float FontSize = 12; |
| | | |
| | | /// <summary> |
| | | /// å½å设å¤ç±»å |
| | | /// </summary> |
| | | public static readonly Device DeviceType = Device.Android; |
| | | |
| | | /// <summary> |
| | | /// è·åå®é
ç宽度 |
| | | /// </summary> |
| | | /// <returns>The real width.</returns> |
| | | /// <param name="width">Width.</param> |
| | | public static int GetRealWidth(int width) |
| | | { |
| | | return (int)(width / WidthScale); |
| | | } |
| | | |
| | | public static void HideSoftInput() |
| | | { |
| | | var imm = (Android.Views.InputMethods.InputMethodManager)Application.Activity.GetSystemService(Context.InputMethodService); |
| | | if (Shared.EditText.Instance != null) |
| | | { |
| | | imm.HideSoftInputFromWindow(Shared.EditText.Instance.AndroidView.WindowToken, 0); //强å¶éèé®ç |
| | | } |
| | | else |
| | | { |
| | | imm.ToggleSoftInput(0, Android.Views.InputMethods.HideSoftInputFlags.NotAlways); |
| | | } |
| | | } |
| | | |
| | | /// <summary> |
| | | /// è·åæå°æ¯ä¾çå®é
å¼ |
| | | /// </summary> |
| | | /// <returns>The minimum real.</returns> |
| | | /// <param name="widthOrHeight">Width or height.</param> |
| | | public static int GetMinReal(int widthOrHeight) |
| | | { |
| | | return (int)(widthOrHeight / MinScale); |
| | | } |
| | | |
| | | /// <summary> |
| | | /// è·åå¹³åå®é
å¼ |
| | | /// </summary> |
| | | /// <returns>The minimum real average.</returns> |
| | | /// <param name="widthOrHeight">Width or height.</param> |
| | | public static int GetMinRealAverage(int widthOrHeight) |
| | | { |
| | | return (int)(widthOrHeight / AverageScale); |
| | | } |
| | | |
| | | public static void RunOnMainThread (Action action) |
| | | { |
| | | if (System.Threading.Thread.CurrentThread.ManagedThreadId == mainThreadId) { |
| | | action (); |
| | | } else { |
| | | //System.Threading.Tasks.Task.Run (() => { |
| | | Activity.RunOnUiThread (action); |
| | | //}); |
| | | }; |
| | | } |
| | | |
| | | public static bool IsWifi; |
| | | |
| | | |
| | | /// <summary> |
| | | /// å½å设å¤ç宽度 |
| | | /// </summary> |
| | | public static int CurrentWidth { get; internal set;} |
| | | |
| | | /// <summary> |
| | | /// å½å设å¤çé«åº¦ |
| | | /// </summary> |
| | | public static int CurrentHeight { get; internal set; } |
| | | |
| | | |
| | | /// <summary> |
| | | /// 宽度æ¯ä¾ |
| | | /// </summary> |
| | | /// <value>The width scale.</value> |
| | | public static float WidthScale |
| | | { |
| | | get |
| | | { |
| | | return DesignWidth * 1.0f / CurrentWidth; |
| | | } |
| | | } |
| | | |
| | | /// <summary> |
| | | /// é«åº¦æ¯ä¾ |
| | | /// </summary> |
| | | /// <value>The height scale.</value> |
| | | public static float HeightScale |
| | | { |
| | | get |
| | | { |
| | | return DesignHeight * 1.0f / CurrentHeight; |
| | | } |
| | | } |
| | | |
| | | /// <summary> |
| | | /// æå°æ¯ä¾ |
| | | /// </summary> |
| | | /// <value>The minimum scale.</value> |
| | | public static float MinScale |
| | | { |
| | | get |
| | | { |
| | | return WidthScale < HeightScale ? WidthScale : HeightScale; |
| | | } |
| | | } |
| | | |
| | | /// <summary> |
| | | /// å¹³åæ¯ä¾ |
| | | /// </summary> |
| | | /// <value>The average scale.</value> |
| | | public static float AverageScale |
| | | { |
| | | get |
| | | { |
| | | return (WidthScale + HeightScale)/2; |
| | | } |
| | | } |
| | | |
| | | |
| | | /// <summary> |
| | | /// 设计宽度 |
| | | /// </summary> |
| | | public static int DesignWidth=640; |
| | | /// <summary> |
| | | /// 设计é«åº¦ |
| | | /// </summary> |
| | | public static int DesignHeight=1136; |
| | | |
| | | /// <summary> |
| | | /// å½åçActivity |
| | | /// </summary> |
| | | public static Android.App.Activity Activity { get; internal set;} |
| | | |
| | | /// <summary> |
| | | /// å½å主页 |
| | | /// </summary> |
| | | /// <value>The main page.</value> |
| | | public static Shared.FrameLayout MainPage |
| | | { |
| | | get; |
| | | private set; |
| | | } |
| | | static int mainThreadId; |
| | | static Android.Widget.FrameLayout rootFrameLayout; |
| | | /// <summary> |
| | | /// æ ¹å®¹å¨è§å¾ |
| | | /// </summary> |
| | | /// <value>The root frame layout.</value> |
| | | public static Android.Widget.FrameLayout RootFrameLayout |
| | | { |
| | | get |
| | | { |
| | | return rootFrameLayout; |
| | | } |
| | | set |
| | | { |
| | | mainThreadId = System.Threading.Thread.CurrentThread.ManagedThreadId; |
| | | rootFrameLayout = value; |
| | | rootFrameLayout.LayoutParameters.Width = CurrentWidth; |
| | | rootFrameLayout.LayoutParameters.Height = CurrentHeight; |
| | | |
| | | MainPage = new FrameLayout(value) { Width = value.Width, Height = value.Height,BackgroundColor=0xFF000000, Parent = new RootView() { Width = value.Width, Height = value.Height } }; |
| | | MainPage.Refresh(); |
| | | } |
| | | } |
| | | |
| | | /// <summary> |
| | | /// æ°æ®æä»¶æ ¹ç®å½ |
| | | /// </summary> |
| | | /// <value>The root path.</value> |
| | | public static readonly string RootPath=System.Environment.GetFolderPath(System.Environment.SpecialFolder.Personal)+"/"; |
| | | |
| | | |
| | | /// <summary> |
| | | /// æ¯å¦æ¯pad |
| | | /// </summary> |
| | | public static bool IsPad |
| | | { |
| | | get { |
| | | return false; |
| | | //TelephonyManager telephony = (TelephonyManager)Activity.GetSystemService (Context.TelephonyService); |
| | | //if (telephony.PhoneType == PhoneType.None) { |
| | | // return true; |
| | | //} else { |
| | | // return false; |
| | | //} |
| | | } |
| | | } |
| | | |
| | | /// <summary> |
| | | /// ç®è¤ï¼nullæ¶è¡¨ç¤ºç¨é»è®¤ç |
| | | /// </summary> |
| | | public static string Skin; |
| | | /// <summary> |
| | | /// GPSä½ç½®ååäºä»¶ |
| | | /// </summary> |
| | | public static Action<double, double> LocationAction; |
| | | } |
| | | } |
New file |
| | |
| | | using System; |
| | | using Android.Runtime; |
| | | using Android.Views; |
| | | using Com.Hdl.Widget; |
| | | |
| | | namespace Shared |
| | | { |
| | | |
| | | /// <summary> |
| | | /// ArcScaleSeekBar ç©ºè° å»åº¦åå¼§æ§ä»¶ |
| | | /// </summary> |
| | | public class ArcScaleSeekBar : View |
| | | { |
| | | /// <summary> |
| | | /// å½åè§å¾ |
| | | /// </summary> |
| | | /// <value>The HDLArcScaleSeekBar.</value> |
| | | HDLArcScaleSeekBar mHDLArcScaleSeekBar |
| | | { |
| | | get |
| | | { |
| | | return AndroidView as HDLArcScaleSeekBar; |
| | | } |
| | | set |
| | | { |
| | | AndroidView = value; |
| | | } |
| | | } |
| | | |
| | | /// <summary> |
| | | /// æé 彿° |
| | | /// </summary> |
| | | public ArcScaleSeekBar() |
| | | { |
| | | mHDLArcScaleSeekBar = new HDLArcScaleSeekBar(Application.Activity); |
| | | mOnProgressChangeListener = new OnProgressChangeListener(this); |
| | | mHDLArcScaleSeekBar.SetOnProgressChangeListener(mOnProgressChangeListener); |
| | | |
| | | |
| | | } |
| | | |
| | | |
| | | |
| | | /// <summary> |
| | | /// è¿åº¦å¼æ¾ç¤ºåä½ |
| | | /// </summary> |
| | | /// <value>åä½å符</value> |
| | | public String ProgressBarUnitSring |
| | | { |
| | | set |
| | | { |
| | | mHDLArcScaleSeekBar.SetProgressBarUnitSring(value); |
| | | } |
| | | } |
| | | |
| | | /// <summary> |
| | | /// è¿åº¦å¼æå¤§å¼ |
| | | /// </summary> |
| | | /// <value>æå¤§å¼</value> |
| | | public int MaxValue |
| | | { |
| | | set |
| | | { |
| | | mHDLArcScaleSeekBar.SetMaxValue(value); |
| | | } |
| | | } |
| | | |
| | | /// <summary> |
| | | /// è¿åº¦å¼æå°å¼ |
| | | /// </summary> |
| | | /// <value>æå°å¼</value> |
| | | public int MinValue |
| | | { |
| | | set |
| | | { |
| | | mHDLArcScaleSeekBar.SetMinValue(value); |
| | | } |
| | | } |
| | | |
| | | /// <summary> |
| | | /// å½åè¿åº¦å¼ |
| | | /// </summary> |
| | | /// <value>è¿åº¦å¼</value> |
| | | public int Progress |
| | | { |
| | | set |
| | | { |
| | | mHDLArcScaleSeekBar.Progress = value; |
| | | } |
| | | |
| | | get |
| | | { |
| | | |
| | | return mHDLArcScaleSeekBar.Progress; |
| | | } |
| | | } |
| | | |
| | | |
| | | |
| | | /// <summary> |
| | | /// å½åè¿åº¦å¼æ¾ç¤ºçæåé¢è² |
| | | /// </summary> |
| | | /// <value>æåé¢è²</value> |
| | | public uint ProgressTextColor |
| | | { |
| | | set |
| | | { |
| | | |
| | | byte r, g, b, a; |
| | | r = (byte)(value / 256 / 256 % 256); |
| | | g = (byte)(value / 256 % 256); |
| | | b = (byte)(value % 256); |
| | | a = (byte)(value / 256 / 256 / 256 % 256); |
| | | |
| | | mHDLArcScaleSeekBar.SetProgressTextColor(Android.Graphics.Color.Argb(a, r, g, b)); |
| | | |
| | | |
| | | |
| | | } |
| | | } |
| | | |
| | | /// <summary> |
| | | /// å½åè¿åº¦å¼æ¾ç¤ºçæåå¤§å° |
| | | /// </summary> |
| | | /// <value>æå大å°</value> |
| | | public int ProgressTextSize |
| | | { |
| | | set => mHDLArcScaleSeekBar.SetProgressTextSize(value); |
| | | } |
| | | |
| | | /// <summary> |
| | | /// æ¯å¦å¯ä»¥æ»å¨ |
| | | /// </summary> |
| | | /// <value>æ¯å¦å¯ä»¥æ»å¨</value> |
| | | public bool IsClickable |
| | | { |
| | | set |
| | | { |
| | | mHDLArcScaleSeekBar.SetIsClickable(value); |
| | | } |
| | | } |
| | | |
| | | /// <summary> |
| | | /// æ¯å¦å¯ä»¥æ»å¨ |
| | | /// </summary> |
| | | /// <value>æ¯å¦å¯ä»¥æ»å¨</value> |
| | | public bool IsProgressTextShow |
| | | { |
| | | set |
| | | { |
| | | mHDLArcScaleSeekBar.SetProgressTextShow(value); |
| | | } |
| | | } |
| | | |
| | | |
| | | |
| | | /// <summary> |
| | | /// 设置è¿åº¦æ¡ æ¸åé¢è²çå¼å§é¢è²åç»æé¢è² |
| | | /// </summary> |
| | | /// <value>å¼å§é¢è²ãç»æé¢è²</value> |
| | | public void SetProgressBarColors(uint startColor, uint endColor) |
| | | { |
| | | byte r, g, b, a; |
| | | r = (byte)(startColor / 256 / 256 % 256); |
| | | g = (byte)(startColor / 256 % 256); |
| | | b = (byte)(startColor % 256); |
| | | a = (byte)(startColor / 256 / 256 / 256 % 256); |
| | | |
| | | var start = Android.Graphics.Color.Argb(a, r, g, b); |
| | | |
| | | |
| | | byte r2, g2, b2, a2; |
| | | r2 = (byte)(endColor / 256 / 256 % 256); |
| | | g2 = (byte)(endColor / 256 % 256); |
| | | b2 = (byte)(endColor % 256); |
| | | a2 = (byte)(endColor / 256 / 256 / 256 % 256); |
| | | |
| | | var end = Android.Graphics.Color.Argb(a2, r2, g2, b2); |
| | | |
| | | |
| | | mHDLArcScaleSeekBar.SetStartColor(start); |
| | | mHDLArcScaleSeekBar.SetEndColor(end); |
| | | |
| | | } |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | /// <summary> |
| | | /// æ¯å¦ç¦»çº¿ 离线çè¯ç¦æ¢æ»å¨å¹¶ç»å¶èæ¯é®æ¡å± |
| | | /// </summary> |
| | | /// <value>æ¯å¦ç¦»çº¿</value> |
| | | public bool IsOffline |
| | | { |
| | | set |
| | | { |
| | | mHDLArcScaleSeekBar.SetOffline(value); |
| | | } |
| | | } |
| | | |
| | | |
| | | |
| | | |
| | | /// <summary> |
| | | /// EventHandler |
| | | /// </summary> |
| | | public EventHandler<int> OnProgressChangedEvent; |
| | | public EventHandler<bool> OnStartTrackingTouchEvent; |
| | | public EventHandler<int> OnStopTrackingTouchEvent; |
| | | |
| | | /// <summary> |
| | | /// OnProgressChangeListener ç»§æ¿ååºäºä»¶ |
| | | /// </summary> |
| | | OnProgressChangeListener mOnProgressChangeListener; |
| | | |
| | | public class OnProgressChangeListener : Java.Lang.Object, HDLArcScaleSeekBar.IOnProgressChangeListener |
| | | { |
| | | |
| | | ArcScaleSeekBar _ArcScaleSeekBar; |
| | | |
| | | public OnProgressChangeListener(ArcScaleSeekBar view) |
| | | { |
| | | _ArcScaleSeekBar = view; |
| | | } |
| | | |
| | | public void OnProgressChanged(HDLArcScaleSeekBar p0, int p1, bool p2) |
| | | { |
| | | _ArcScaleSeekBar.OnProgressChangedEvent?.Invoke(this, p0.Progress); |
| | | } |
| | | |
| | | public void OnStartTrackingTouch(HDLArcScaleSeekBar p0) |
| | | { |
| | | _ArcScaleSeekBar.OnStartTrackingTouchEvent?.Invoke(this, true); |
| | | } |
| | | |
| | | public void OnStopTrackingTouch(HDLArcScaleSeekBar p0) |
| | | { |
| | | |
| | | //if (_ArcScaleSeekBar.OnStopTrackingTouchEvent != null) |
| | | //{ |
| | | // _ArcScaleSeekBar.OnStopTrackingTouchEvent(this, p0.Progress); |
| | | //} |
| | | _ArcScaleSeekBar.OnStopTrackingTouchEvent?.Invoke(this, p0.Progress); |
| | | |
| | | } |
| | | } |
| | | } |
| | | } |
New file |
| | |
| | | using System; |
| | | using Android.Runtime; |
| | | using Android.Views; |
| | | using Com.Hdl.Widget; |
| | | |
| | | namespace Shared |
| | | { |
| | | |
| | | /// <summary> |
| | | /// HDLArcSeekBar åå¼§æ»å¨æ§ä»¶ |
| | | /// </summary> |
| | | public class ArcSeekBar : View |
| | | { |
| | | /// <summary> |
| | | /// å½åè§å¾ |
| | | /// </summary> |
| | | /// <value>The HDLArcSeekBar.</value> |
| | | HDLArcSeekBar mHDLArcSeekBar |
| | | { |
| | | get |
| | | { |
| | | return AndroidView as HDLArcSeekBar; |
| | | } |
| | | set |
| | | { |
| | | AndroidView = value; |
| | | } |
| | | } |
| | | |
| | | /// <summary> |
| | | /// æé 彿° |
| | | /// </summary> |
| | | public ArcSeekBar() |
| | | { |
| | | mHDLArcSeekBar = new HDLArcSeekBar(Application.Activity); |
| | | mOnProgressChangeListener = new OnProgressChangeListener(this); |
| | | mHDLArcSeekBar.SetOnProgressChangeListener(mOnProgressChangeListener); |
| | | } |
| | | |
| | | //internal static ProgressChangeListener:Com.Hdl.Widget.HDLArcSeekBar.IOnProgressChangeListener(){ |
| | | |
| | | |
| | | //} |
| | | |
| | | /// <summary> |
| | | /// è¿åº¦å¼æ¾ç¤ºåä½ |
| | | /// </summary> |
| | | /// <value>åä½å符</value> |
| | | public String ProgressBarUnitSring |
| | | { |
| | | set |
| | | { |
| | | mHDLArcSeekBar.SetProgressBarUnitSring(value); |
| | | } |
| | | } |
| | | |
| | | /// <summary> |
| | | /// è¿åº¦å¼æå¤§å¼ |
| | | /// </summary> |
| | | /// <value>æå¤§å¼</value> |
| | | public int MaxValue |
| | | { |
| | | set |
| | | { |
| | | mHDLArcSeekBar.SetMaxValue(value); |
| | | } |
| | | } |
| | | |
| | | /// <summary> |
| | | /// è¿åº¦å¼æå°å¼ |
| | | /// </summary> |
| | | /// <value>æå°å¼</value> |
| | | public int MinValue |
| | | { |
| | | set |
| | | { |
| | | mHDLArcSeekBar.SetMinValue(value); |
| | | } |
| | | } |
| | | |
| | | /// <summary> |
| | | /// å½åè¿åº¦å¼ |
| | | /// </summary> |
| | | /// <value>è¿åº¦å¼</value> |
| | | public int Progress |
| | | { |
| | | set |
| | | { |
| | | mHDLArcSeekBar.Progress = value; |
| | | } |
| | | |
| | | get |
| | | { |
| | | |
| | | return mHDLArcSeekBar.Progress; |
| | | } |
| | | } |
| | | |
| | | /// <summary> |
| | | /// åæ¶è®¾ç½®åå¼§åæå¨åå½¢ç宽 |
| | | /// </summary> |
| | | /// <value>宽</value> |
| | | public int ArcWidthWithDefaultStyle |
| | | { |
| | | set |
| | | { |
| | | mHDLArcSeekBar.SetArcWidthDefaultStyle(value); |
| | | } |
| | | } |
| | | |
| | | /// <summary> |
| | | /// åå¼§é»è®¤èæ¯é¢è² |
| | | /// </summary> |
| | | /// <value>èæ¯é¢è²</value> |
| | | public uint ArcColor |
| | | { |
| | | set |
| | | { |
| | | byte r, g, b, a; |
| | | r = (byte)(value / 256 / 256 % 256); |
| | | g = (byte)(value / 256 % 256); |
| | | b = (byte)(value % 256); |
| | | a = (byte)(value / 256 / 256 / 256 % 256); |
| | | |
| | | mHDLArcSeekBar.SetArcColor(Android.Graphics.Color.Argb(a, r, g, b)); |
| | | } |
| | | } |
| | | |
| | | /// <summary> |
| | | /// è¿åº¦æ¡é¢è² åä¸é¢è²ä¸æ¸å |
| | | /// </summary> |
| | | /// <value>åä¸è¿åº¦æ¡é¢è²</value> |
| | | public uint ProgressBarColor |
| | | { |
| | | set |
| | | { |
| | | //mHDLArcSeekBar.SetProgressBarColor(value); |
| | | byte r, g, b, a; |
| | | r = (byte)(value / 256 / 256 % 256); |
| | | g = (byte)(value / 256 % 256); |
| | | b = (byte)(value % 256); |
| | | a = (byte)(value / 256 / 256 / 256 % 256); |
| | | |
| | | mHDLArcSeekBar.SetProgressBarColor(Android.Graphics.Color.Argb(a, r, g, b)); |
| | | } |
| | | |
| | | } |
| | | |
| | | |
| | | uint thumbColor = 0xFFFFFFFF; |
| | | /// <summary> |
| | | /// æå¨æé®åå½¢é¢è² |
| | | /// </summary> |
| | | /// <value>æå¨æé®é¢è²</value> |
| | | public uint ThumbColor |
| | | { |
| | | get |
| | | { |
| | | return thumbColor; |
| | | } |
| | | set |
| | | { |
| | | thumbColor = value; |
| | | |
| | | byte r, g, b, a; |
| | | r = (byte)(thumbColor / 256 / 256 % 256); |
| | | g = (byte)(thumbColor / 256 % 256); |
| | | b = (byte)(thumbColor % 256); |
| | | a = (byte)(thumbColor / 256 / 256 / 256 % 256); |
| | | |
| | | mHDLArcSeekBar.SetThumbColor(Android.Graphics.Color.Argb(a, r, g, b)); |
| | | } |
| | | } |
| | | |
| | | /// <summary> |
| | | /// æå¨æé®é»è®¤å½¢ç¶ 填满å®å¿æè
ç©ºå¿ |
| | | /// </summary> |
| | | /// <value>æ¯å¦å¡«æ»¡</value> |
| | | public bool ThumbModeFill |
| | | { |
| | | set |
| | | { |
| | | if (value) |
| | | { |
| | | mHDLArcSeekBar.SetThumbMode(Com.Hdl.Widget.HDLArcSeekBar.ThumbModeFill); |
| | | } |
| | | else |
| | | { |
| | | mHDLArcSeekBar.SetThumbMode(Com.Hdl.Widget.HDLArcSeekBar.ThumbModeStroke); |
| | | } |
| | | |
| | | } |
| | | } |
| | | |
| | | /// <summary> |
| | | /// æå¨æé®åå½¢åå¾ |
| | | /// </summary> |
| | | /// <value>åå¾</value> |
| | | public int ThumbRadius |
| | | { |
| | | set |
| | | { |
| | | mHDLArcSeekBar.SetThumbRadius(value); |
| | | } |
| | | } |
| | | |
| | | /// <summary> |
| | | /// å弧宽 |
| | | /// </summary> |
| | | /// <value>宽</value> |
| | | public int ArcWidth |
| | | { |
| | | set |
| | | { |
| | | mHDLArcSeekBar.SetArcWidth(value); |
| | | } |
| | | } |
| | | |
| | | /// <summary> |
| | | /// å½åè¿åº¦å¼æ¾ç¤ºçæåé¢è² |
| | | /// </summary> |
| | | /// <value>æåé¢è²</value> |
| | | public uint ProgressTextColor |
| | | { |
| | | set |
| | | { |
| | | |
| | | byte r, g, b, a; |
| | | r = (byte)(value / 256 / 256 % 256); |
| | | g = (byte)(value / 256 % 256); |
| | | b = (byte)(value % 256); |
| | | a = (byte)(value / 256 / 256 / 256 % 256); |
| | | |
| | | mHDLArcSeekBar.SetProgressTextColor(Android.Graphics.Color.Argb(a, r, g, b)); |
| | | |
| | | } |
| | | } |
| | | |
| | | /// <summary> |
| | | /// å½åè¿åº¦å¼æ¾ç¤ºçæåå¤§å° |
| | | /// </summary> |
| | | /// <value>æå大å°</value> |
| | | public int ProgressTextSize |
| | | { |
| | | set => mHDLArcSeekBar.SetProgressTextSize(value); |
| | | } |
| | | |
| | | /// <summary> |
| | | /// æ¯å¦å¯ä»¥æ»å¨ |
| | | /// </summary> |
| | | /// <value>æ¯å¦å¯ä»¥æ»å¨</value> |
| | | public bool IsClickable |
| | | { |
| | | set |
| | | { |
| | | mHDLArcSeekBar.SetIsClickable(value); |
| | | } |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 设置è¿åº¦æ¡ æ¸åé¢è²çå¼å§é¢è²åç»æé¢è² |
| | | /// </summary> |
| | | /// <value>å¼å§é¢è²ãç»æé¢è²</value> |
| | | public void SetProgressBarColors(uint startColor, uint endColor) { |
| | | byte r, g, b, a; |
| | | r = (byte)(startColor / 256 / 256 % 256); |
| | | g = (byte)(startColor / 256 % 256); |
| | | b = (byte)(startColor % 256); |
| | | a = (byte)(startColor / 256 / 256 / 256 % 256); |
| | | |
| | | var start = Android.Graphics.Color.Argb(a, r, g, b); |
| | | |
| | | |
| | | byte r2, g2, b2, a2; |
| | | r2 = (byte)(endColor / 256 / 256 % 256); |
| | | g2 = (byte)(endColor / 256 % 256); |
| | | b2 = (byte)(endColor % 256); |
| | | a2 = (byte)(endColor / 256 / 256 / 256 % 256); |
| | | |
| | | var end = Android.Graphics.Color.Argb(a2, r2, g2, b2); |
| | | |
| | | int[] mArcColors = { start, end }; |
| | | mHDLArcSeekBar.SetProgressBarColors(mArcColors); |
| | | |
| | | } |
| | | |
| | | //public void SetArcColors(uint startColor, uint endColor) |
| | | //{ |
| | | // byte r, g, b, a; |
| | | // r = (byte)(startColor / 256 / 256 % 256); |
| | | // g = (byte)(startColor / 256 % 256); |
| | | // b = (byte)(startColor % 256); |
| | | // a = (byte)(startColor / 256 / 256 / 256 % 256); |
| | | |
| | | // var start = Android.Graphics.Color.Argb(a, r, g, b); |
| | | |
| | | |
| | | // byte r2, g2, b2, a2; |
| | | // r2 = (byte)(endColor / 256 / 256 % 256); |
| | | // g2 = (byte)(endColor / 256 % 256); |
| | | // b2 = (byte)(endColor % 256); |
| | | // a2 = (byte)(endColor / 256 / 256 / 256 % 256); |
| | | |
| | | // var end = Android.Graphics.Color.Argb(a2, r2, g2, b2); |
| | | |
| | | // int[] mArcColors = { start, end, end }; |
| | | // mHDLArcSeekBar.SetArcColors(mArcColors); |
| | | |
| | | //} |
| | | |
| | | |
| | | |
| | | /// <summary> |
| | | /// EventHandler |
| | | /// </summary> |
| | | public EventHandler<int> OnProgressChangedEvent; |
| | | public EventHandler<bool> OnStartTrackingTouchEvent; |
| | | public EventHandler<int> OnStopTrackingTouchEvent; |
| | | |
| | | /// <summary> |
| | | /// OnProgressChangeListener ç»§æ¿ååºäºä»¶ |
| | | /// </summary> |
| | | OnProgressChangeListener mOnProgressChangeListener; |
| | | |
| | | public class OnProgressChangeListener : Java.Lang.Object, HDLArcSeekBar.IOnProgressChangeListener |
| | | { |
| | | |
| | | ArcSeekBar _ArcSeekBar; |
| | | |
| | | public OnProgressChangeListener(ArcSeekBar view) |
| | | { |
| | | _ArcSeekBar = view; |
| | | } |
| | | |
| | | public void OnProgressChanged(HDLArcSeekBar p0, int p1, bool p2) |
| | | { |
| | | _ArcSeekBar.OnProgressChangedEvent?.Invoke(this, p0.Progress); |
| | | } |
| | | |
| | | public void OnStartTrackingTouch(HDLArcSeekBar p0) |
| | | { |
| | | _ArcSeekBar.OnStartTrackingTouchEvent?.Invoke(this, true); |
| | | } |
| | | |
| | | public void OnStopTrackingTouch(HDLArcSeekBar p0) |
| | | { |
| | | |
| | | //if (_ArcSeekBar.OnStopTrackingTouchEvent != null) |
| | | //{ |
| | | // _ArcSeekBar.OnStopTrackingTouchEvent(this, p0.Progress); |
| | | //} |
| | | _ArcSeekBar.OnStopTrackingTouchEvent?.Invoke(this, p0.Progress); |
| | | |
| | | } |
| | | } |
| | | } |
| | | } |
New file |
| | |
| | | using System; |
| | | using Android.Content; |
| | | using Android.Runtime; |
| | | using Android.Views; |
| | | using Android.Util; |
| | | using Android.Graphics.Drawables; |
| | | using Android.Views.Animations; |
| | | using Android.Graphics; |
| | | using Android.OS; |
| | | using Android.Views.InputMethods; |
| | | using Android.Text; |
| | | |
| | | namespace Shared |
| | | { |
| | | |
| | | |
| | | //å·²ç»å
¨é¢æ£æ¥äºä»£ç |
| | | /// <summary> |
| | | /// Button æé® |
| | | /// </summary> |
| | | public class Button : View |
| | | { |
| | | /// <summary> |
| | | /// å½åè§å¾ |
| | | /// </summary> |
| | | /// <value>The android button.</value> |
| | | AndroidButton currentButton { |
| | | get { |
| | | return AndroidView as AndroidButton; |
| | | } |
| | | set { |
| | | AndroidView = value; |
| | | } |
| | | } |
| | | |
| | | /// <summary> |
| | | /// æé 彿° |
| | | /// </summary> |
| | | public Button () |
| | | { |
| | | currentButton = new AndroidButton (Application.Activity, this); |
| | | currentButton.SetTextSize (ComplexUnitType.Sp, Application.FontSize); |
| | | |
| | | } |
| | | |
| | | byte[] imageBytes; |
| | | public byte[] ImageBytes |
| | | { |
| | | get |
| | | { |
| | | return imageBytes; |
| | | } |
| | | set |
| | | { |
| | | imageBytes = value; |
| | | IsSelected = isSelected; |
| | | } |
| | | } |
| | | /// <summary> |
| | | /// æåå¤§å° |
| | | /// </summary> |
| | | /// <value>The size of the text.</value> |
| | | public float TextSize { |
| | | get { |
| | | return currentButton.TextSize; |
| | | } |
| | | set { |
| | | currentButton.SetTextSize (ComplexUnitType.Sp, value); |
| | | } |
| | | } |
| | | |
| | | int textID; |
| | | /// <summary> |
| | | /// æ ¹æ®IDè·å对åºç夿³¨ |
| | | /// </summary> |
| | | /// <value>The text I.</value> |
| | | public int TextID { |
| | | get { |
| | | return textID; |
| | | } |
| | | set { |
| | | textID = value; |
| | | Text = Language.StringByID (TextID); |
| | | } |
| | | } |
| | | |
| | | /// <summary> |
| | | /// ææ¬ |
| | | /// </summary> |
| | | /// <value>The text.</value> |
| | | public string Text { |
| | | get { |
| | | return currentButton.Text; |
| | | } |
| | | set { |
| | | |
| | | currentButton.Text = value; |
| | | } |
| | | } |
| | | |
| | | /// <summary> |
| | | /// åä½åç§° |
| | | /// </summary> |
| | | /// <value>The name of the font.</value> |
| | | public string FontName { |
| | | get { |
| | | return ""; |
| | | } |
| | | set { |
| | | var typeFace = Typeface.CreateFromAsset (Shared.Application.Activity.Assets, "titilliumtext25l005.otf"); |
| | | if (typeFace != null) { |
| | | currentButton.SetTypeface (typeFace, TypefaceStyle.Normal); |
| | | } |
| | | } |
| | | } |
| | | |
| | | bool isMoreLines; |
| | | public bool IsMoreLines { |
| | | get { |
| | | return isMoreLines; |
| | | } |
| | | set { |
| | | isMoreLines = value; |
| | | currentButton.SetSingleLine (!value); |
| | | } |
| | | } |
| | | |
| | | |
| | | /// <summary> |
| | | /// å·æ° |
| | | /// </summary> |
| | | public override void Refresh () |
| | | { |
| | | base.Refresh (); |
| | | IsSelected = isSelected; |
| | | } |
| | | |
| | | uint textColor = 0xFFFFFFFF; |
| | | /// <summary> |
| | | /// æåé¢è² |
| | | /// </summary> |
| | | /// <value>The color of the text.</value> |
| | | public uint TextColor { |
| | | get { |
| | | return textColor; |
| | | } |
| | | set { |
| | | textColor = value; |
| | | if (IsSelected) { |
| | | return; |
| | | } |
| | | byte r, g, b, a; |
| | | r = (byte)(textColor / 256 / 256 % 256); |
| | | g = (byte)(textColor / 256 % 256); |
| | | b = (byte)(textColor % 256); |
| | | a = (byte)(textColor / 256 / 256 / 256 % 256); |
| | | |
| | | currentButton.SetTextColor (Android.Graphics.Color.Argb (a, r, g, b)); |
| | | } |
| | | } |
| | | |
| | | uint selecteTextColor = 0xFFFFFFFF; |
| | | /// <summary> |
| | | /// æåé¢è² |
| | | /// </summary> |
| | | /// <value>The color of the text.</value> |
| | | public uint SelectedTextColor { |
| | | get { |
| | | return selecteTextColor; |
| | | } |
| | | set { |
| | | selecteTextColor = value; |
| | | if (!IsSelected) { |
| | | return; |
| | | } |
| | | byte r, g, b, a; |
| | | r = (byte)(selecteTextColor / 256 / 256 % 256); |
| | | g = (byte)(selecteTextColor / 256 % 256); |
| | | b = (byte)(selecteTextColor % 256); |
| | | a = (byte)(selecteTextColor / 256 / 256 / 256 % 256); |
| | | |
| | | currentButton.SetTextColor (Android.Graphics.Color.Argb (a, r, g, b)); |
| | | } |
| | | } |
| | | |
| | | bool isSelected; |
| | | /// <summary> |
| | | /// éä¸ç¶æ |
| | | /// </summary> |
| | | /// <value><c>true</c> if this instance is selected; otherwise, <c>false</c>.</value> |
| | | public bool IsSelected { |
| | | get { |
| | | return isSelected; |
| | | } |
| | | set { |
| | | isSelected = value; |
| | | if (!IsCanRefresh) { |
| | | return; |
| | | } |
| | | if (isSelected) { |
| | | if (SelectedImagePath == null) { |
| | | SelectedBackgroundColor = SelectedBackgroundColor; |
| | | } else { |
| | | Background (SelectedImagePath); |
| | | } |
| | | SelectedTextColor = selecteTextColor; |
| | | } else { |
| | | if (imageBytes != null) |
| | | { |
| | | AndroidView.Background = Bytes2Drawable(imageBytes); |
| | | return; |
| | | } |
| | | if (UnSelectedImagePath == null) { |
| | | BackgroundColor = BackgroundColor; |
| | | } else { |
| | | Background (UnSelectedImagePath); |
| | | } |
| | | TextColor = textColor; |
| | | } |
| | | } |
| | | } |
| | | |
| | | |
| | | |
| | | |
| | | TextAlignment textAlignment = TextAlignment.Center; |
| | | /// <summary> |
| | | /// æå坹齿¹å¼ |
| | | /// </summary> |
| | | /// <param name="horizontalAlignment">横å</param> |
| | | /// <param name="verticalAlignment">纵å</param> |
| | | public TextAlignment TextAlignment { |
| | | get { |
| | | return textAlignment; |
| | | } |
| | | set { |
| | | textAlignment = value; |
| | | switch (value) { |
| | | case TextAlignment.TopLeft: |
| | | currentButton.Gravity = GravityFlags.Top | GravityFlags.Left; |
| | | break; |
| | | case TextAlignment.TopCenter: |
| | | currentButton.Gravity = GravityFlags.Top | GravityFlags.Center; |
| | | break; |
| | | case TextAlignment.TopRight: |
| | | currentButton.Gravity = GravityFlags.Top | GravityFlags.Right; |
| | | break; |
| | | case TextAlignment.CenterLeft: |
| | | currentButton.Gravity = GravityFlags.Center | GravityFlags.Left; |
| | | break; |
| | | case TextAlignment.Center: |
| | | currentButton.Gravity = GravityFlags.Center | GravityFlags.Center; |
| | | break; |
| | | case TextAlignment.CenterRight: |
| | | currentButton.Gravity = GravityFlags.Center | GravityFlags.Right; |
| | | break; |
| | | case TextAlignment.BottomLeft: |
| | | currentButton.Gravity = GravityFlags.Bottom | GravityFlags.Left; |
| | | break; |
| | | case TextAlignment.BottomCenter: |
| | | currentButton.Gravity = GravityFlags.Bottom | GravityFlags.Center; |
| | | break; |
| | | case TextAlignment.BottomRight: |
| | | currentButton.Gravity = GravityFlags.Bottom | GravityFlags.Right; |
| | | break; |
| | | } |
| | | } |
| | | } |
| | | |
| | | /// <summary> |
| | | /// å
è¾¹è· |
| | | /// </summary> |
| | | /// <value>The padding.</value> |
| | | public override Padding Padding { |
| | | get { |
| | | return new Padding (currentButton.PaddingTop, currentButton.PaddingLeft, currentButton.PaddingBottom, currentButton.PaddingRight); |
| | | } |
| | | set { |
| | | currentButton.SetPadding (value.Left, value.Top, value.Right, value.Bottom); |
| | | } |
| | | } |
| | | |
| | | string selectedImagePath; |
| | | /// <summary> |
| | | /// éæ©æ¶èæ¯å¾è·¯å¾ |
| | | /// </summary> |
| | | /// <value>The selected image path.</value> |
| | | public string SelectedImagePath { |
| | | get { |
| | | return selectedImagePath; |
| | | } |
| | | set { |
| | | selectedImagePath = value; |
| | | IsSelected = isSelected; |
| | | } |
| | | } |
| | | |
| | | string unSelectedImagePath; |
| | | /// <summary> |
| | | /// ééä¸ç¶æçèæ¯å¾è·¯å¾ |
| | | /// </summary> |
| | | /// <value>The un selected image path.</value> |
| | | public string UnSelectedImagePath { |
| | | get { |
| | | return unSelectedImagePath; |
| | | } |
| | | set { |
| | | unSelectedImagePath = value; |
| | | IsSelected = isSelected; |
| | | } |
| | | } |
| | | |
| | | uint selectedBackgroundColor; |
| | | /// <summary> |
| | | /// éæ©æ¶èæ¯é¢è² |
| | | /// </summary> |
| | | /// <value>The color of the text.</value> |
| | | public uint SelectedBackgroundColor { |
| | | get { |
| | | return selectedBackgroundColor; |
| | | } |
| | | set { |
| | | selectedBackgroundColor = value; |
| | | if (AndroidView.Background == null || AndroidView.Background.GetType () != typeof (GradientDrawable)) { |
| | | AndroidView.Background = new Android.Graphics.Drawables.GradientDrawable (); |
| | | } |
| | | |
| | | var gradientDrawable = (GradientDrawable)AndroidView.Background; |
| | | gradientDrawable.SetCornerRadius (DensityUtil.Dip2Px (Radius)); |
| | | byte r, g, b, a; |
| | | r = (byte)(BorderColor / 256 / 256 % 256); |
| | | g = (byte)(BorderColor / 256 % 256); |
| | | b = (byte)(BorderColor % 256); |
| | | a = (byte)(BorderColor / 256 / 256 / 256 % 256); |
| | | gradientDrawable.SetStroke ((int)BorderWidth, Android.Graphics.Color.Argb (a, r, g, b)); |
| | | |
| | | r = (byte)(selectedBackgroundColor / 256 / 256 % 256); |
| | | g = (byte)(selectedBackgroundColor / 256 % 256); |
| | | b = (byte)(selectedBackgroundColor % 256); |
| | | a = (byte)(selectedBackgroundColor / 256 / 256 / 256 % 256); |
| | | gradientDrawable.SetColor (Android.Graphics.Color.Argb (a, r, g, b).ToArgb ()); |
| | | } |
| | | |
| | | } |
| | | |
| | | internal class AndroidButton : Android.Widget.Button |
| | | { |
| | | View view; |
| | | public AndroidButton (Context context, View view) |
| | | : base (context) |
| | | { |
| | | this.view = view; |
| | | SetBackgroundColor (Android.Graphics.Color.Transparent); |
| | | SetPadding (0, 0, 0, 0); |
| | | SetTextColor (Android.Graphics.Color.White); |
| | | SetLines (1); |
| | | SetEllipsize (true); |
| | | } |
| | | |
| | | public override bool OnTouchEvent (MotionEvent e) |
| | | { |
| | | var v = base.OnTouchEvent (e); |
| | | view?.TouchEvent (e); |
| | | return true; |
| | | } |
| | | |
| | | public void SetEllipsize (bool ellipsize) { |
| | | if (ellipsize) { |
| | | Ellipsize = TextUtils.TruncateAt.End; |
| | | } else { |
| | | Ellipsize = TextUtils.TruncateAt.Marquee; |
| | | } |
| | | } |
| | | |
| | | public override TextUtils.TruncateAt Ellipsize { get => base.Ellipsize; set => base.Ellipsize = value; } |
| | | } |
| | | } |
| | | } |
New file |
| | |
| | | using System; |
| | | using Android.Content; |
| | | using Android.App; |
| | | using Android.OS; |
| | | using Android.Graphics; |
| | | using Android.Widget; |
| | | using Android.Provider; |
| | | using Java.IO; |
| | | using Android.Graphics.Drawables; |
| | | |
| | | namespace Shared |
| | | { |
| | | [Activity(MainLauncher = false, Theme = "@android:style/Theme.NoTitleBar.Fullscreen")] |
| | | internal class CameraActivity : Android.App.Activity |
| | | { |
| | | bool isZoom; |
| | | protected override void OnCreate(Android.OS.Bundle savedInstanceState) |
| | | { |
| | | base.OnCreate(savedInstanceState); |
| | | isZoom = Intent.Extras.GetBoolean("IsZoom", true); |
| | | if (Intent.Extras.GetInt("Type") == Camera.TypePicture) |
| | | { |
| | | var intent = new Intent(Intent.ActionPick); |
| | | intent.SetType("image/*");//ç¸çç±»å |
| | | StartActivityForResult(intent, Camera.TypePicture); |
| | | } |
| | | else |
| | | { |
| | | if (Android.OS.Environment.ExternalStorageState == Android.OS.Environment.MediaMounted) |
| | | { |
| | | var getImageByCamera = new Intent("android.media.action.IMAGE_CAPTURE"); |
| | | StartActivityForResult(getImageByCamera, Camera.TypeCamera); |
| | | } |
| | | else |
| | | { |
| | | Toast.MakeText(Shared.Application.Activity, "Makue Sure SD Card", ToastLength.Long).Show(); |
| | | } |
| | | } |
| | | } |
| | | |
| | | |
| | | |
| | | |
| | | /// <summary> |
| | | /// å¤çéæ©æè
æç
§çå¾ç |
| | | /// </summary> |
| | | /// <param name="requestCode">Request code.</param> |
| | | /// <param name="resultCode">Result code.</param> |
| | | /// <param name="data">Data.</param> |
| | | protected override void OnActivityResult(int requestCode, Result resultCode, Intent data) |
| | | { |
| | | try |
| | | { |
| | | base.OnActivityResult(requestCode, resultCode, data); |
| | | if (Camera._callback == null) |
| | | { |
| | | return; |
| | | } |
| | | if (resultCode != Result.Ok) |
| | | { |
| | | Camera._callback(null); |
| | | return; |
| | | } |
| | | |
| | | var path = System.IO.Path.Combine(Shared.Application.RootPath, Camera._fileName); |
| | | var uri = data.Data; |
| | | if (uri == null) |
| | | { |
| | | var bundle = data.Extras; |
| | | if (bundle == null) |
| | | { |
| | | Toast.MakeText(Shared.Application.Activity, "Error", ToastLength.Long).Show(); |
| | | path = null; |
| | | } |
| | | else |
| | | { |
| | | compressAndGenImage((Bitmap)bundle.Get("data"), path, 200); |
| | | } |
| | | } |
| | | else |
| | | { |
| | | var photoPath = uri.Path; |
| | | if (!System.IO.File.Exists(photoPath)) |
| | | { |
| | | //è·åç
§çè·¯å¾ |
| | | string[] filePathColumn = { MediaStore.Audio.AudioColumns.Data }; |
| | | var cursor = Shared.Application.Activity.ContentResolver.Query(uri, filePathColumn, null, null, null); |
| | | cursor.MoveToFirst(); |
| | | photoPath = cursor.GetString(cursor.GetColumnIndex(filePathColumn[0])); |
| | | cursor.Close(); |
| | | } |
| | | |
| | | compressAndGenImage(BitmapFactory.DecodeFile(photoPath), path, 200); |
| | | } |
| | | Camera._callback(path); |
| | | } |
| | | finally |
| | | { |
| | | Finish(); |
| | | } |
| | | } |
| | | void compressAndGenImage(Bitmap bitmap, string outPath, int maxSize) |
| | | { |
| | | if (isZoom) |
| | | { |
| | | var width = bitmap.Width; |
| | | var height = bitmap.Height; |
| | | //System.Console.WriteLine("å宽度=" + bitmap.Width + "é«åº¦=" + bitmap.Height); |
| | | var noScale = width * 1.0f / height; |
| | | var scale = 16.0f / 9.0f; |
| | | float x = 0, y = 0, w = width, h = height; |
| | | if (scale < noScale) |
| | | { |
| | | w = height * scale; |
| | | x = (width - w) / 2; |
| | | } |
| | | else |
| | | { |
| | | h = width / scale; |
| | | y = (height - h) / 2; |
| | | } |
| | | var matrix = new Matrix(); |
| | | matrix.PostScale(Shared.Application.GetRealWidth(640) * 1.0f / w, Shared.Application.GetRealHeight(360) * 1.0f / h); |
| | | bitmap = Bitmap.CreateBitmap(bitmap, (int)x, (int)y, (int)w, (int)h, matrix, true); |
| | | |
| | | //System.Console.WriteLine("ç°å¨å®½åº¦=" + bitmap.Width + "é«åº¦=" + bitmap.Height); |
| | | var fs = new System.IO.FileStream(outPath, System.IO.FileMode.Create, System.IO.FileAccess.Write); |
| | | // scale |
| | | var options = 100; |
| | | // Store the bitmap into output stream(no compress) |
| | | bitmap.Compress(Bitmap.CompressFormat.Jpeg, options, fs); |
| | | // Compress by loop |
| | | while (fs.Length / 1024 > maxSize) |
| | | { |
| | | // Clean up os |
| | | fs.Close(); |
| | | // interval 10 |
| | | options -= 10; |
| | | fs = new System.IO.FileStream(outPath, System.IO.FileMode.Create, System.IO.FileAccess.Write); |
| | | bitmap.Compress(Bitmap.CompressFormat.Jpeg, options, fs); |
| | | } |
| | | |
| | | fs.Flush(); |
| | | fs.Close(); |
| | | } |
| | | else |
| | | { |
| | | var fs = new System.IO.FileStream(outPath, System.IO.FileMode.Create, System.IO.FileAccess.Write); |
| | | // scale |
| | | var options = 100; |
| | | // Store the bitmap into output stream(no compress) |
| | | bitmap.Compress(Bitmap.CompressFormat.Jpeg, options, fs); |
| | | fs.Flush(); |
| | | fs.Close(); |
| | | } |
| | | } |
| | | |
| | | } |
| | | |
| | | /// <summary> |
| | | /// æç
§æè
éæ©å¾ç |
| | | /// </summary> |
| | | public static class Camera |
| | | { |
| | | /// <summary> |
| | | /// æç
§æè
读åå¾ç宿æ¶è°ç¨çå¨ä½,string==nullè¡¨ç¤ºç¨æ·åæ¶äºæç
§æè
åæ¶éæ©å¾ç,string!=null,表示å¾ççè·¯å¾ |
| | | /// </summary> |
| | | internal static Action<string> _callback; |
| | | /// <summary> |
| | | /// æä»¶å |
| | | /// </summary> |
| | | internal static string _fileName; |
| | | /// <summary> |
| | | /// éæ©ç±»åæ¯æç
§ |
| | | /// </summary> |
| | | internal static readonly int TypeCamera = 0xFF0001; |
| | | /// <summary> |
| | | /// éæ©å¾ç |
| | | /// </summary> |
| | | internal static readonly int TypePicture = 0xFF0002; |
| | | /// <summary> |
| | | /// æç
§ |
| | | /// </summary> |
| | | /// <param name="callback">åè°å½æ°</param> |
| | | /// <param name="fileName">æä»¶å</param> |
| | | public static void TakePicture(Action<string> callback, string fileName,bool isZoom=true) |
| | | { |
| | | (Application.Activity as BaseActivity)?.SetCamera((obj) => { |
| | | if(obj){ |
| | | _callback = callback; |
| | | var intent = new Intent(Application.Activity, typeof(CameraActivity)); |
| | | intent.PutExtra("Type", TypeCamera); |
| | | intent.PutExtra("IsZoom", isZoom); |
| | | Application.Activity?.StartActivity(intent); |
| | | } |
| | | else{ |
| | | callback?.Invoke(null); |
| | | } |
| | | }); |
| | | _fileName = fileName; |
| | | |
| | | } |
| | | |
| | | /// <summary> |
| | | /// éæ©å¾ç |
| | | /// </summary> |
| | | /// <param name="callback">åè°å½æ°</param> |
| | | /// <param name="fileName">æä»¶å</param> |
| | | public static void SelectPicture(Action<string> callback, string fileName, bool isZoom = true) |
| | | { |
| | | (Application.Activity as BaseActivity)?.SetImagePermission((obj) => |
| | | { |
| | | if (obj) |
| | | { |
| | | _fileName = fileName; |
| | | _callback = callback; |
| | | var intent = new Intent(Application.Activity, typeof(CameraActivity)); |
| | | intent.PutExtra("Type", TypePicture); |
| | | intent.PutExtra("IsZoom", isZoom); |
| | | Application.Activity?.StartActivity(intent); |
| | | }else{ |
| | | callback?.Invoke(null); |
| | | } |
| | | }); |
| | | } |
| | | } |
| | | } |
| | | |
New file |
| | |
| | | using System; |
| | | using Android.Content; |
| | | using Android.Graphics; |
| | | using Android.Graphics.Drawables; |
| | | using Android.Util; |
| | | using Android.Views; |
| | | |
| | | namespace Shared |
| | | { |
| | | /// <summary> |
| | | /// è²æ¿ |
| | | /// </summary> |
| | | public class ColorPicker : View |
| | | { |
| | | MyColorPickerView myColorPickerView { |
| | | get { |
| | | return AndroidView as MyColorPickerView; |
| | | } |
| | | set { |
| | | AndroidView = value; |
| | | } |
| | | } |
| | | |
| | | /// <summary> |
| | | /// Initializes a new instance of the <see cref="Shared.Button"/> class. |
| | | /// </summary> |
| | | public ColorPicker() |
| | | { |
| | | myColorPickerView = new MyColorPickerView(Application.Activity,this); |
| | | } |
| | | |
| | | |
| | | string colorImagePath; |
| | | /// <summary> |
| | | /// è²æ¿å¾ |
| | | /// </summary> |
| | | /// <value>The color image path.</value> |
| | | public string ColorImagePath { |
| | | get { |
| | | return colorImagePath; |
| | | } |
| | | set { |
| | | colorImagePath = value; |
| | | Background (colorImagePath); |
| | | } |
| | | } |
| | | |
| | | /// <summary> |
| | | /// é¢è²åå |
| | | /// </summary> |
| | | public Action<View, byte[]> ColorChaged; |
| | | |
| | | public class MyColorPickerView : Android.Views.View |
| | | { |
| | | Bitmap bitmapTemp; |
| | | |
| | | View _view; |
| | | public MyColorPickerView(Context context, View view) |
| | | : base(context) |
| | | { |
| | | _view = view; |
| | | } |
| | | |
| | | public override Android.Graphics.Drawables.Drawable Background |
| | | { |
| | | get |
| | | { |
| | | return base.Background; |
| | | } |
| | | set |
| | | { |
| | | base.Background = value; |
| | | |
| | | bitmapTemp = drawableToBitmap(value); |
| | | } |
| | | } |
| | | |
| | | static Bitmap drawableToBitmap(Drawable drawable) |
| | | { |
| | | if (drawable == null) |
| | | { |
| | | return null; |
| | | } |
| | | var bitmap = Bitmap.CreateBitmap(drawable.IntrinsicWidth,drawable.IntrinsicHeight,Bitmap.Config.Rgb565); |
| | | |
| | | Canvas canvas = new Canvas(bitmap); |
| | | drawable.SetBounds(0, 0, drawable.IntrinsicWidth, drawable.IntrinsicHeight); |
| | | drawable.Draw(canvas); |
| | | return bitmap; |
| | | } |
| | | /// <summary> |
| | | /// éåç¹å»äºä»¶ |
| | | /// </summary> |
| | | /// <returns><c>true</c>, if touch event was oned, <c>false</c> otherwise.</returns> |
| | | /// <param name="e">E.</param> |
| | | public override bool OnTouchEvent(MotionEvent e) |
| | | { |
| | | if (_view != null && _view.Enable) |
| | | { |
| | | _view.TouchEvent( e); |
| | | } |
| | | if (bitmapTemp != null && (_view as ColorPicker).ColorChaged != null) |
| | | { |
| | | int x = Math.Abs((int)(e.GetX() * bitmapTemp.Width / Width)); |
| | | int y = Math.Abs((int)(e.GetY() * bitmapTemp.Height / Height)); |
| | | if (bitmapTemp.Width <= x) { |
| | | x = bitmapTemp.Width - 1; |
| | | } |
| | | |
| | | if (bitmapTemp.Height <= y) { |
| | | y = bitmapTemp.Height - 1; |
| | | } |
| | | var color = bitmapTemp.GetPixel(x,y); |
| | | (_view as ColorPicker).ColorChaged(_view, new byte[] { (byte)((color >> 16) & 0xFF), (byte)((color >> 8) & 0xFF), (byte)(color & 0xFF) }); |
| | | //Console.WriteLine("ColorChaged colorï¼" + color); |
| | | } |
| | | |
| | | //return base.OnTouchEvent(e); |
| | | return true;//2019-09-09 æ¹ä¸º return true |
| | | } |
| | | } |
| | | } |
| | | } |
New file |
| | |
| | | using System; |
| | | using Android.Content; |
| | | |
| | | namespace Shared |
| | | { |
| | | public static class Contacts |
| | | { |
| | | public static Action<string,string> ContactAction; |
| | | public static void Open() |
| | | { |
| | | (Shared.Application.Activity as BaseActivity).SetContactsPermission((b) => { |
| | | if (b) |
| | | { |
| | | // 跳转å°è系人çé¢ |
| | | var intent = new Intent(); |
| | | intent.SetAction("android.intent.action.PICK"); |
| | | intent.AddCategory("android.intent.category.DEFAULT"); |
| | | intent.SetType("vnd.android.cursor.dir/phone_v2"); |
| | | Shared.Application.Activity.StartActivityForResult(intent, 0x30); |
| | | } |
| | | else { |
| | | ContactAction?.Invoke(null, null); |
| | | } |
| | | }); |
| | | } |
| | | } |
| | | } |
New file |
| | |
| | | using System; |
| | | using Android.Content; |
| | | |
| | | using Com.Hdl.Widget.Cropimage; |
| | | using Com.Hdl.Widget; |
| | | using static Com.Hdl.Widget.Cropimage.HDLCropImageActivity; |
| | | |
| | | namespace Shared |
| | | { |
| | | |
| | | /// <summary> |
| | | /// æç
§æè
éæ©å¾ç |
| | | /// </summary> |
| | | public static class CropImage |
| | | { |
| | | ///// <summary> |
| | | ///// æç
§æè
读åå¾ç宿æ¶è°ç¨çå¨ä½,string==nullè¡¨ç¤ºç¨æ·åæ¶äºæç
§æè
åæ¶éæ©å¾ç,string!=null,表示å¾ççè·¯å¾ |
| | | ///// </summary> |
| | | //internal static Action<string> _callback; |
| | | ///// <summary> |
| | | ///// æä»¶å |
| | | ///// </summary> |
| | | //internal static string _fileName; |
| | | ///// <summary> |
| | | /// éæ©ç±»åæ¯æç
§ |
| | | /// </summary> |
| | | internal static readonly int TypeCamera = 101; |
| | | /// <summary> |
| | | /// éæ©å¾ç |
| | | /// </summary> |
| | | internal static readonly int TypePicture = 102; |
| | | |
| | | |
| | | |
| | | |
| | | /// <summary> |
| | | /// æç
§ |
| | | /// </summary> |
| | | /// <param name="callback">åè°å½æ°</param> |
| | | /// <param name="fileName">æä»¶å</param> |
| | | /// <param name="mRATIO_X">宽髿¯ç宽å¼</param> |
| | | /// <param name="mRATIO_Y">宽髿¯çé«å¼</param> |
| | | /// <param name="OutputYSize">å¾çå¤§å° å辨çé«å¼ï¼è¯¥å¼ä¸è½è¿é«ï¼ä¼å
åä¸è¶³ä¼ éä¸äºè£åªå¾çèµæº 300以å
<</param> |
| | | public static void TakePicture(Action<string> callback, string fileName, int mRATIO_X = 1, int mRATIO_Y = 1, int OutputYSize = 200) |
| | | { |
| | | (Application.Activity as BaseActivity)?.SetCamera((obj) => { |
| | | if(obj){ |
| | | //_callback = callback; |
| | | |
| | | HDLCropImageActivity.MOnCropImageeCallback = new OnCropImageeCallback(callback); |
| | | var intent = new Intent(Application.Activity, typeof(HDLCropImageActivity)); |
| | | intent.PutExtra(HDLUtlisXM.CropTypeKey, TypeCamera); |
| | | intent.PutExtra(HDLUtlisXM.CropNameKey, fileName); |
| | | intent.PutExtra(HDLUtlisXM.CropRatioXKey, mRATIO_X); |
| | | intent.PutExtra(HDLUtlisXM.CropRatioYKey, mRATIO_Y); |
| | | intent.PutExtra(HDLUtlisXM.CropOutputYKey, OutputYSize); |
| | | //intent.PutExtra("IsZoom", isZoom); |
| | | Application.Activity?.StartActivity(intent); |
| | | } |
| | | else{ |
| | | callback?.Invoke(null); |
| | | } |
| | | }); |
| | | |
| | | |
| | | |
| | | |
| | | //_fileName = fileName; |
| | | |
| | | } |
| | | |
| | | /// <summary> |
| | | /// éæ©å¾ç |
| | | /// <param name="callback">åè°å½æ°</param> |
| | | /// <param name="fileName">æä»¶å</param> |
| | | /// <param name="mRATIO_X">宽髿¯ç宽å¼</param> |
| | | /// <param name="mRATIO_Y">宽髿¯çé«å¼</param> |
| | | /// <param name="OutputYSize">å¾çå¤§å° å辨çé«å¼ï¼è¯¥å¼ä¸è½è¿é«ï¼ä¼å
åä¸è¶³ä¼ éä¸äºè£åªå¾çèµæº 300以å
</param> |
| | | public static void SelectPicture(Action<string> callback, string fileName, int mRATIO_X = 1, int mRATIO_Y = 1, int OutputYSize = 200) |
| | | { |
| | | (Application.Activity as BaseActivity)?.SetImagePermission((obj) => |
| | | { |
| | | if (obj) |
| | | { |
| | | //_fileName = fileName; |
| | | //_callback = callback; |
| | | HDLCropImageActivity.MOnCropImageeCallback = new OnCropImageeCallback(callback); |
| | | |
| | | var intent = new Intent(Application.Activity, typeof(HDLCropImageActivity)); |
| | | intent.PutExtra(HDLUtlisXM.CropTypeKey, TypePicture); |
| | | intent.PutExtra(HDLUtlisXM.CropNameKey, fileName); |
| | | intent.PutExtra(HDLUtlisXM.CropRatioXKey, mRATIO_X); |
| | | intent.PutExtra(HDLUtlisXM.CropRatioYKey, mRATIO_Y); |
| | | intent.PutExtra(HDLUtlisXM.CropOutputYKey, OutputYSize); |
| | | //intent.PutExtra("IsZoom", isZoom); |
| | | Application.Activity?.StartActivity(intent); |
| | | }else{ |
| | | callback?.Invoke(null); |
| | | } |
| | | }); |
| | | } |
| | | |
| | | |
| | | /// <summary> |
| | | /// OnCropImageeCallback |
| | | /// </summary> |
| | | public class OnCropImageeCallback : Java.Lang.Object, IOnCropImageeCallback |
| | | { |
| | | |
| | | Action<string> mAction; |
| | | public OnCropImageeCallback(Action<string> action) |
| | | { |
| | | mAction = action; |
| | | } |
| | | |
| | | public void OnSaveCallback(string p0) |
| | | { |
| | | mAction?.Invoke(p0); |
| | | } |
| | | } |
| | | |
| | | |
| | | |
| | | } |
| | | } |
| | | |
New file |
| | |
| | | using System; |
| | | using Android.Runtime; |
| | | using Android.Views; |
| | | using Com.Hdl.Widget; |
| | | |
| | | namespace Shared |
| | | { |
| | | |
| | | /// <summary> |
| | | /// CurtainRollSeekBar å·å¸æ»å¨æ§ä»¶ |
| | | /// </summary> |
| | | public class CurtainRollSeekBar : View |
| | | { |
| | | /// <summary> |
| | | /// å½åè§å¾ |
| | | /// </summary> |
| | | /// <value>The HDLRollCurtainSeekBar.</value> |
| | | HDLRollCurtainSeekBar mHDLRollCurtainSeekBar |
| | | { |
| | | get |
| | | { |
| | | return AndroidView as HDLRollCurtainSeekBar; |
| | | } |
| | | set |
| | | { |
| | | AndroidView = value; |
| | | } |
| | | } |
| | | |
| | | /// <summary> |
| | | /// æé 彿° |
| | | /// </summary> |
| | | public CurtainRollSeekBar() |
| | | { |
| | | mHDLRollCurtainSeekBar = new HDLRollCurtainSeekBar(Application.Activity); |
| | | mOnProgressChangeListener = new OnProgressChangeListener(this); |
| | | mHDLRollCurtainSeekBar.SetOnProgressChangeListener(mOnProgressChangeListener); |
| | | |
| | | //SeekBarPadding = 5; |
| | | //CurtainPaddingTop = 10; |
| | | } |
| | | |
| | | //internal static ProgressChangeListener:Com.Hdl.Widget.HDLRollCurtainSeekBar.IOnProgressChangeListener(){ |
| | | |
| | | |
| | | //} |
| | | |
| | | /// <summary> |
| | | /// è¿åº¦å¼æ¾ç¤ºåä½ |
| | | /// </summary> |
| | | /// <value>åä½å符</value> |
| | | public String ProgressBarUnitSring |
| | | { |
| | | set |
| | | { |
| | | mHDLRollCurtainSeekBar.SetProgressBarUnitSring(value); |
| | | } |
| | | } |
| | | |
| | | /// <summary> |
| | | /// è¿åº¦å¼æå¤§å¼ |
| | | /// </summary> |
| | | /// <value>æå¤§å¼</value> |
| | | public int MaxValue |
| | | { |
| | | set |
| | | { |
| | | mHDLRollCurtainSeekBar.SetMaxValue(value); |
| | | } |
| | | } |
| | | |
| | | /// <summary> |
| | | /// è¿åº¦å¼æå°å¼ |
| | | /// </summary> |
| | | /// <value>æå°å¼</value> |
| | | public int MinValue |
| | | { |
| | | set |
| | | { |
| | | mHDLRollCurtainSeekBar.SetMinValue(value); |
| | | } |
| | | } |
| | | |
| | | /// <summary> |
| | | /// å½åè¿åº¦å¼ |
| | | /// </summary> |
| | | /// <value>è¿åº¦å¼</value> |
| | | public int Progress |
| | | { |
| | | set |
| | | { |
| | | mHDLRollCurtainSeekBar.Progress = value; |
| | | } |
| | | |
| | | get |
| | | { |
| | | |
| | | return mHDLRollCurtainSeekBar.Progress; |
| | | } |
| | | } |
| | | |
| | | |
| | | |
| | | /// <summary> |
| | | /// å½åè¿åº¦å¼æ¾ç¤ºçæåé¢è² |
| | | /// </summary> |
| | | /// <value>æåé¢è²</value> |
| | | public uint ProgressTextColor |
| | | { |
| | | set |
| | | { |
| | | |
| | | byte r, g, b, a; |
| | | r = (byte)(value / 256 / 256 % 256); |
| | | g = (byte)(value / 256 % 256); |
| | | b = (byte)(value % 256); |
| | | a = (byte)(value / 256 / 256 / 256 % 256); |
| | | |
| | | mHDLRollCurtainSeekBar.SetProgressTextColor(Android.Graphics.Color.Argb(a, r, g, b)); |
| | | |
| | | |
| | | |
| | | } |
| | | } |
| | | |
| | | /// <summary> |
| | | /// å½åè¿åº¦å¼æ¾ç¤ºçæåå¤§å° |
| | | /// </summary> |
| | | /// <value>æå大å°</value> |
| | | public int ProgressTextSize |
| | | { |
| | | set => mHDLRollCurtainSeekBar.SetProgressTextSize(value); |
| | | } |
| | | |
| | | /// <summary> |
| | | /// æ¯å¦å¯ä»¥æ»å¨ |
| | | /// </summary> |
| | | /// <value>æ¯å¦å¯ä»¥æ»å¨</value> |
| | | public bool IsClickable |
| | | { |
| | | set |
| | | { |
| | | mHDLRollCurtainSeekBar.SetIsClickable(value); |
| | | } |
| | | } |
| | | |
| | | /// <summary> |
| | | /// æ¯å¦å¯ä»¥æ»å¨ |
| | | /// </summary> |
| | | /// <value>æ¯å¦å¯ä»¥æ»å¨</value> |
| | | public bool IsProgressTextShow |
| | | { |
| | | set |
| | | { |
| | | mHDLRollCurtainSeekBar.SetProgressTextShow(value); |
| | | } |
| | | } |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | /// <summary> |
| | | /// è¿åº¦æ¡ä¸å·¦å³è¾¹æ¡è¾¹è· |
| | | /// </summary> |
| | | public int CurtainPaddingLeftRight |
| | | { |
| | | set |
| | | { |
| | | mHDLRollCurtainSeekBar.SetCurtainPadding(value); |
| | | } |
| | | } |
| | | |
| | | |
| | | /// <summary> |
| | | /// é¡¶é¨padding |
| | | /// </summary> |
| | | public int CurtainPaddingTop |
| | | { |
| | | set |
| | | { |
| | | mHDLRollCurtainSeekBar.SetCurtainPaddingTop(value); |
| | | } |
| | | } |
| | | |
| | | |
| | | /// <summary> |
| | | /// æ¯å¦ç¦»çº¿ 离线çè¯ç¦æ¢æ»å¨å¹¶ç»å¶èæ¯é®æ¡å± |
| | | /// </summary> |
| | | /// <value>æ¯å¦ç¦»çº¿</value> |
| | | public bool IsOffline |
| | | { |
| | | set |
| | | { |
| | | mHDLRollCurtainSeekBar.SetOffline(value); |
| | | } |
| | | } |
| | | |
| | | |
| | | |
| | | /// <summary> |
| | | /// EventHandler |
| | | /// </summary> |
| | | public EventHandler<int> OnProgressChangedEvent; |
| | | public EventHandler<bool> OnStartTrackingTouchEvent; |
| | | public EventHandler<int> OnStopTrackingTouchEvent; |
| | | |
| | | /// <summary> |
| | | /// OnProgressChangeListener ç»§æ¿ååºäºä»¶ |
| | | /// </summary> |
| | | OnProgressChangeListener mOnProgressChangeListener; |
| | | |
| | | public class OnProgressChangeListener : Java.Lang.Object, HDLRollCurtainSeekBar.IOnProgressChangeListener |
| | | { |
| | | |
| | | CurtainRollSeekBar _CurtainRollSeekBar; |
| | | |
| | | public OnProgressChangeListener(CurtainRollSeekBar view) |
| | | { |
| | | _CurtainRollSeekBar = view; |
| | | } |
| | | |
| | | public void OnProgressChanged(HDLRollCurtainSeekBar p0, int p1, bool p2) |
| | | { |
| | | _CurtainRollSeekBar.OnProgressChangedEvent?.Invoke(this, p0.Progress); |
| | | } |
| | | |
| | | public void OnStartTrackingTouch(HDLRollCurtainSeekBar p0) |
| | | { |
| | | _CurtainRollSeekBar.OnStartTrackingTouchEvent?.Invoke(this, true); |
| | | } |
| | | |
| | | public void OnStopTrackingTouch(HDLRollCurtainSeekBar p0) |
| | | { |
| | | |
| | | //if (_CurtainSeekBar.OnStopTrackingTouchEvent != null) |
| | | //{ |
| | | // _CurtainSeekBar.OnStopTrackingTouchEvent(this, p0.Progress); |
| | | //} |
| | | _CurtainRollSeekBar.OnStopTrackingTouchEvent?.Invoke(this, p0.Progress); |
| | | |
| | | } |
| | | } |
| | | } |
| | | } |
New file |
| | |
| | | using System; |
| | | using Android.Runtime; |
| | | using Android.Views; |
| | | using Com.Hdl.Widget; |
| | | |
| | | namespace Shared |
| | | { |
| | | |
| | | /// <summary> |
| | | /// CurtainSeekBar å¼å叿»å¨æ§ä»¶ |
| | | /// </summary> |
| | | public class CurtainSeekBar : View |
| | | { |
| | | /// <summary> |
| | | /// å½åè§å¾ |
| | | /// </summary> |
| | | /// <value>The HDLOACCurtainSeekBar.</value> |
| | | HDLOACCurtainSeekBar mHDLOACCurtainSeekBar |
| | | { |
| | | get |
| | | { |
| | | return AndroidView as HDLOACCurtainSeekBar; |
| | | } |
| | | set |
| | | { |
| | | AndroidView = value; |
| | | } |
| | | } |
| | | |
| | | /// <summary> |
| | | /// æé 彿° |
| | | /// </summary> |
| | | public CurtainSeekBar() |
| | | { |
| | | mHDLOACCurtainSeekBar = new HDLOACCurtainSeekBar(Application.Activity); |
| | | mOnProgressChangeListener = new OnProgressChangeListener(this); |
| | | mHDLOACCurtainSeekBar.SetOnProgressChangeListener(mOnProgressChangeListener); |
| | | |
| | | |
| | | } |
| | | |
| | | //internal static ProgressChangeListener:Com.Hdl.Widget.HDLOACCurtainSeekBar.IOnProgressChangeListener(){ |
| | | |
| | | |
| | | //} |
| | | |
| | | /// <summary> |
| | | /// è¿åº¦å¼æ¾ç¤ºåä½ |
| | | /// </summary> |
| | | /// <value>åä½å符</value> |
| | | public String ProgressBarUnitSring |
| | | { |
| | | set |
| | | { |
| | | mHDLOACCurtainSeekBar.SetProgressBarUnitSring(value); |
| | | } |
| | | } |
| | | |
| | | /// <summary> |
| | | /// è¿åº¦å¼æå¤§å¼ |
| | | /// </summary> |
| | | /// <value>æå¤§å¼</value> |
| | | public int MaxValue |
| | | { |
| | | set |
| | | { |
| | | mHDLOACCurtainSeekBar.SetMaxValue(value); |
| | | } |
| | | } |
| | | |
| | | /// <summary> |
| | | /// è¿åº¦å¼æå°å¼ |
| | | /// </summary> |
| | | /// <value>æå°å¼</value> |
| | | public int MinValue |
| | | { |
| | | set |
| | | { |
| | | mHDLOACCurtainSeekBar.SetMinValue(value); |
| | | } |
| | | } |
| | | |
| | | /// <summary> |
| | | /// å½åè¿åº¦å¼ |
| | | /// </summary> |
| | | /// <value>è¿åº¦å¼</value> |
| | | public int Progress |
| | | { |
| | | set |
| | | { |
| | | mHDLOACCurtainSeekBar.Progress = value; |
| | | } |
| | | |
| | | get |
| | | { |
| | | |
| | | return mHDLOACCurtainSeekBar.Progress; |
| | | } |
| | | } |
| | | |
| | | |
| | | |
| | | /// <summary> |
| | | /// å½åè¿åº¦å¼æ¾ç¤ºçæåé¢è² |
| | | /// </summary> |
| | | /// <value>æåé¢è²</value> |
| | | public uint ProgressTextColor |
| | | { |
| | | set |
| | | { |
| | | |
| | | byte r, g, b, a; |
| | | r = (byte)(value / 256 / 256 % 256); |
| | | g = (byte)(value / 256 % 256); |
| | | b = (byte)(value % 256); |
| | | a = (byte)(value / 256 / 256 / 256 % 256); |
| | | |
| | | mHDLOACCurtainSeekBar.SetProgressTextColor(Android.Graphics.Color.Argb(a, r, g, b)); |
| | | |
| | | |
| | | |
| | | } |
| | | } |
| | | |
| | | /// <summary> |
| | | /// å½åè¿åº¦å¼æ¾ç¤ºçæåå¤§å° |
| | | /// </summary> |
| | | /// <value>æå大å°</value> |
| | | public int ProgressTextSize |
| | | { |
| | | set => mHDLOACCurtainSeekBar.SetProgressTextSize(value); |
| | | } |
| | | |
| | | /// <summary> |
| | | /// æ¯å¦å¯ä»¥æ»å¨ |
| | | /// </summary> |
| | | /// <value>æ¯å¦å¯ä»¥æ»å¨</value> |
| | | public bool IsClickable |
| | | { |
| | | set |
| | | { |
| | | mHDLOACCurtainSeekBar.SetIsClickable(value); |
| | | } |
| | | } |
| | | |
| | | /// <summary> |
| | | /// æ¯å¦å¯ä»¥æ»å¨ |
| | | /// </summary> |
| | | /// <value>æ¯å¦å¯ä»¥æ»å¨</value> |
| | | public bool IsProgressTextShow |
| | | { |
| | | set |
| | | { |
| | | mHDLOACCurtainSeekBar.SetProgressTextShow(value); |
| | | } |
| | | } |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | /// <summary> |
| | | /// è¿åº¦æ¡ä¸å·¦å³è¾¹æ¡è¾¹è· |
| | | /// </summary> |
| | | public int CurtainPaddingLeftRight |
| | | { |
| | | set |
| | | { |
| | | mHDLOACCurtainSeekBar.SetCurtainPadding(value); |
| | | } |
| | | } |
| | | |
| | | |
| | | |
| | | /// <summary> |
| | | /// é¡¶é¨padding |
| | | /// </summary> |
| | | public int CurtainPaddingTop |
| | | { |
| | | set |
| | | { |
| | | mHDLOACCurtainSeekBar.SetCurtainPaddingTop(value); |
| | | } |
| | | } |
| | | |
| | | |
| | | |
| | | /// <summary> |
| | | /// æ¯å¦ç¦»çº¿ 离线çè¯ç¦æ¢æ»å¨å¹¶ç»å¶èæ¯é®æ¡å± |
| | | /// </summary> |
| | | /// <value>æ¯å¦ç¦»çº¿</value> |
| | | public bool IsOffline |
| | | { |
| | | set |
| | | { |
| | | mHDLOACCurtainSeekBar.SetOffline(value); |
| | | } |
| | | } |
| | | |
| | | |
| | | |
| | | |
| | | /// <summary> |
| | | /// EventHandler |
| | | /// </summary> |
| | | public EventHandler<int> OnProgressChangedEvent; |
| | | public EventHandler<bool> OnStartTrackingTouchEvent; |
| | | public EventHandler<int> OnStopTrackingTouchEvent; |
| | | |
| | | /// <summary> |
| | | /// OnProgressChangeListener ç»§æ¿ååºäºä»¶ |
| | | /// </summary> |
| | | OnProgressChangeListener mOnProgressChangeListener; |
| | | |
| | | public class OnProgressChangeListener : Java.Lang.Object, HDLOACCurtainSeekBar.IOnProgressChangeListener |
| | | { |
| | | |
| | | CurtainSeekBar _CurtainSeekBar; |
| | | |
| | | public OnProgressChangeListener(CurtainSeekBar view) |
| | | { |
| | | _CurtainSeekBar = view; |
| | | } |
| | | |
| | | public void OnProgressChanged(HDLOACCurtainSeekBar p0, int p1, bool p2) |
| | | { |
| | | _CurtainSeekBar.OnProgressChangedEvent?.Invoke(this, p0.Progress); |
| | | } |
| | | |
| | | public void OnStartTrackingTouch(HDLOACCurtainSeekBar p0) |
| | | { |
| | | _CurtainSeekBar.OnStartTrackingTouchEvent?.Invoke(this, true); |
| | | } |
| | | |
| | | public void OnStopTrackingTouch(HDLOACCurtainSeekBar p0) |
| | | { |
| | | |
| | | //if (_CurtainSeekBar.OnStopTrackingTouchEvent != null) |
| | | //{ |
| | | // _CurtainSeekBar.OnStopTrackingTouchEvent(this, p0.Progress); |
| | | //} |
| | | _CurtainSeekBar.OnStopTrackingTouchEvent?.Invoke(this, p0.Progress); |
| | | |
| | | } |
| | | } |
| | | } |
| | | } |
New file |
| | |
| | | using Android.Content;
|
| | | using Android.Runtime;
|
| | | using Android.Util;
|
| | | using System;
|
| | | using System.Collections.Generic;
|
| | | using System.Linq;
|
| | | using System.Text;
|
| | | using Android.Views; |
| | | |
| | | namespace Shared
|
| | | { |
| | | /// <summary>
|
| | | /// æ¥æè§å¾
|
| | | /// </summary>
|
| | | public class DateView : View |
| | | { |
| | | /// <summary>
|
| | | /// å½åè§å¾
|
| | | /// </summary>
|
| | | /// <value>The android text.</value>
|
| | | AndroidDatePicker currentAndroidDatePicker |
| | | { |
| | | get |
| | | { |
| | | return AndroidView as AndroidDatePicker; |
| | | } |
| | | set |
| | | { |
| | | AndroidView = value; |
| | | } |
| | | } |
| | | |
| | | |
| | | /// <summary>
|
| | | /// å¹´
|
| | | /// </summary>
|
| | | public int Year |
| | | { |
| | | get { return currentAndroidDatePicker.Year; } |
| | | } |
| | | /// <summary>
|
| | | /// æ
|
| | | /// </summary>
|
| | | public int Month |
| | | { |
| | | get { return currentAndroidDatePicker.Month; } |
| | | } |
| | | /// <summary>
|
| | | /// 天
|
| | | /// </summary>
|
| | | public int Day |
| | | { |
| | | get { return currentAndroidDatePicker.DayOfMonth; } |
| | | } |
| | | |
| | | /// <summary>
|
| | | /// å®ä¾
|
| | | /// </summary>
|
| | | public DateView() |
| | | { |
| | | currentAndroidDatePicker = new AndroidDatePicker(Application.Activity); |
| | | } |
| | | |
| | | /// <summary>
|
| | | /// Android åç AndroidDatePicker
|
| | | /// </summary>
|
| | | class AndroidDatePicker : Android.Widget.DatePicker |
| | | { |
| | | public AndroidDatePicker(Context context) |
| | | : base(context) |
| | | { } |
| | | } |
| | | }
|
| | | }
|
New file |
| | |
| | | using System; |
| | | |
| | | |
| | | namespace Shared |
| | | { |
| | | /// <summary> |
| | | /// å¼¹çªè§å¾ |
| | | /// </summary> |
| | | public class Dialog |
| | | { |
| | | Button tempButton; |
| | | FrameLayout mainFrameLayout; |
| | | /// <summary> |
| | | /// å¼¹çªè§å¾æé 彿° |
| | | /// </summary> |
| | | public Dialog () |
| | | { |
| | | Application.MainPage.AddChidren (tempButton = new Button () { Visible = false, Width = LayoutParams.MatchParent, Height = LayoutParams.MatchParent, BackgroundColor = 0x88323232 }); |
| | | Application.MainPage.AddChidren (mainFrameLayout = new FrameLayout () { Visible = false, Tag = "Dialog" }); |
| | | } |
| | | /// <summary> |
| | | /// èæ¯é¢è² |
| | | /// </summary> |
| | | /// <value>The color of the background.</value> |
| | | public uint BackgroundColor { |
| | | get { |
| | | return mainFrameLayout.BackgroundColor; |
| | | } |
| | | set { |
| | | mainFrameLayout.BackgroundColor = value; |
| | | } |
| | | } |
| | | |
| | | /// <summary> |
| | | /// åè§å¤§å° |
| | | /// </summary> |
| | | /// <value>The corner.</value> |
| | | public uint Radius { |
| | | get { |
| | | return mainFrameLayout.Radius; |
| | | } |
| | | set { |
| | | mainFrameLayout.Radius = value; |
| | | } |
| | | } |
| | | |
| | | /// <summary> |
| | | /// è¾¹æ¡çº¿å¤§å° |
| | | /// </summary> |
| | | /// <value>The width of the border.</value> |
| | | public uint BorderWidth { |
| | | get { |
| | | return mainFrameLayout.BorderWidth; |
| | | } |
| | | set { |
| | | mainFrameLayout.BorderWidth = value; |
| | | } |
| | | } |
| | | |
| | | /// <summary> |
| | | /// å¢å åæ§ä»¶ |
| | | /// </summary> |
| | | /// <param name="view">View.</param> |
| | | public void AddChidren (View view) |
| | | { |
| | | mainFrameLayout.AddChidren (view); |
| | | } |
| | | /// <summary> |
| | | /// èæ¯å¾çè·¯å¾ |
| | | /// </summary> |
| | | /// <value>The background image path.</value> |
| | | public string BackgroundImagePath { |
| | | get { |
| | | return mainFrameLayout.BackgroundImagePath; |
| | | } |
| | | set { |
| | | mainFrameLayout.BackgroundImagePath = value; |
| | | } |
| | | } |
| | | /// <summary> |
| | | /// 宽度 |
| | | /// </summary> |
| | | /// <value>The width.</value> |
| | | public int Width { |
| | | get { |
| | | return mainFrameLayout.Width; |
| | | } |
| | | set { |
| | | mainFrameLayout.Width = value; |
| | | } |
| | | } |
| | | /// <summary> |
| | | /// é«å®½ |
| | | /// </summary> |
| | | /// <value>The height.</value> |
| | | public int Height { |
| | | get { |
| | | return mainFrameLayout.Height; |
| | | } |
| | | set { |
| | | mainFrameLayout.Height = value; |
| | | } |
| | | } |
| | | /// <summary> |
| | | /// X |
| | | /// </summary> |
| | | /// <value>The height.</value> |
| | | public int X { |
| | | get { |
| | | return mainFrameLayout.X; |
| | | } |
| | | set { |
| | | mainFrameLayout.X = value; |
| | | } |
| | | } |
| | | /// <summary> |
| | | /// Y |
| | | /// </summary> |
| | | /// <value>The height.</value> |
| | | public int Y { |
| | | get { |
| | | return mainFrameLayout.Y; |
| | | } |
| | | set { |
| | | mainFrameLayout.Y = value; |
| | | } |
| | | } |
| | | /// <summary> |
| | | /// æ¾ç¤ºå½åççé¢ |
| | | /// </summary> |
| | | public void Show () |
| | | { |
| | | tempButton.Visible = true; |
| | | mainFrameLayout.Visible = true; |
| | | mainFrameLayout.Gravity = Gravity.Center; |
| | | tempButton.BringToFront (); |
| | | mainFrameLayout.BringToFront (); |
| | | } |
| | | /// <summary> |
| | | /// å
³éå½åççé¢ï¼éæ¾èµæº |
| | | /// </summary> |
| | | public void Close () |
| | | { |
| | | tempButton.RemoveFromParent (); |
| | | mainFrameLayout.RemoveFromParent (); |
| | | } |
| | | |
| | | //public void RemoveFromParent () |
| | | //{ |
| | | // Console.WriteLine ("Dialog RemoveFromParent!!!"); |
| | | // tempButton.RemoveFromParent (); |
| | | // mainFrameLayout.RemoveFromParent (); |
| | | //} |
| | | |
| | | } |
| | | } |
New file |
| | |
| | | //using System; |
| | | //using Android.Content; |
| | | //using Android.Views; |
| | | //using Android.Util; |
| | | //using Android.Runtime; |
| | | //using Android.Widget; |
| | | //using Android.OS; |
| | | //using Android.Views.Animations; |
| | | |
| | | //namespace Shared |
| | | //{ |
| | | // //å·²ç»å
¨é¢æ£æ¥äºä»£ç |
| | | // /// <summary> |
| | | // /// 卿»å¨äºä»¶ä¸ï¼å¯æ¾ç¤ºéèäºèªå®ä¹è§å¾ |
| | | // /// </summary> |
| | | // public class DrawerLayout : ViewGroup |
| | | // { |
| | | // AndroidDrawerLayout androidDrawerLayout; |
| | | |
| | | // //uint lineColor = 0x62818181; |
| | | // ///// <summary> |
| | | // ///// èæ¯é¢è² |
| | | // ///// </summary> |
| | | // ///// <value>The color of the background.</value> |
| | | // //public virtual uint LineColor |
| | | // //{ |
| | | // // get |
| | | // // { |
| | | // // return lineColor; |
| | | // // } |
| | | // // set |
| | | // // { |
| | | // // lineColor = value; |
| | | // // byte r, g, b, a; |
| | | // // r = (byte)(lineColor / 256 / 256 % 256); |
| | | // // g = (byte)(lineColor / 256 % 256); |
| | | // // b = (byte)(lineColor % 256); |
| | | // // a = (byte)(lineColor / 256 / 256 / 256 % 256); |
| | | // // lineLinearLayout.SetBackgroundColor(Android.Graphics.Color.Argb(a, r, g, b)); |
| | | // // } |
| | | // //} |
| | | |
| | | // /// <summary> |
| | | // /// 宽度设置æè¯»å |
| | | // /// </summary> |
| | | // /// <value>The width.</value> |
| | | // public override int Width |
| | | // { |
| | | // get |
| | | // { |
| | | // return base.Width; |
| | | // } |
| | | // set |
| | | // { |
| | | // base.Width = value; |
| | | // if (!IsCanRefresh) |
| | | // { |
| | | // return; |
| | | // } |
| | | // var layoutParameters = androidDrawerLayout.LayoutParameters; |
| | | // layoutParameters.Width = Width; |
| | | // androidDrawerLayout.LayoutParameters = layoutParameters; |
| | | // } |
| | | // } |
| | | |
| | | // /// <summary> |
| | | // /// è§å¾é«åº¦ |
| | | // /// </summary> |
| | | // /// <value>The height.</value> |
| | | // public override int Height |
| | | // { |
| | | // get |
| | | // { |
| | | // return base.Height; |
| | | // } |
| | | // set |
| | | // { |
| | | // base.Height = value; |
| | | // if (!IsCanRefresh) |
| | | // { |
| | | // return; |
| | | // } |
| | | // var layoutParameters = androidDrawerLayout.LayoutParameters; |
| | | // layoutParameters.Height = Height; |
| | | // androidDrawerLayout.LayoutParameters = layoutParameters; |
| | | // } |
| | | // } |
| | | |
| | | // Android.Widget.FrameLayout leftLinarLayout; |
| | | // //Android.Widget.LinearLayout rightLinarLayout; |
| | | // //Android.Widget.LinearLayout lineLinearLayout; |
| | | // /// <summary> |
| | | // /// 卿»å¨äºä»¶ä¸ï¼å¯æ¾ç¤ºéèäºèªå®ä¹è§å¾ |
| | | // /// </summary> |
| | | // public DrawerLayout() |
| | | // { |
| | | // viewGroup = new Android.Widget.RelativeLayout(Application.Activity); |
| | | // androidDrawerLayout = new AndroidDrawerLayout(Application.Activity, this) { }; |
| | | |
| | | // androidDrawerLayout.LeftToRightAction += () => |
| | | // { |
| | | // openLeftMenu(); |
| | | // }; |
| | | // realViewGroup = androidDrawerLayout; |
| | | // leftLinarLayout = new Android.Widget.FrameLayout(Application.Activity) { Alpha = 0.0f }; |
| | | // //rightLinarLayout = new Android.Widget.LinearLayout(Application.Activity) { Orientation = Android.Widget.Orientation.Horizontal, Alpha = 0.0f }; |
| | | // //lineLinearLayout = new Android.Widget.LinearLayout(Application.Activity); |
| | | // //LineColor = lineColor; |
| | | // viewGroup.AddView(leftLinarLayout, new Android.Views.ViewGroup.LayoutParams(Android.Views.ViewGroup.LayoutParams.WrapContent, Android.Views.ViewGroup.LayoutParams.MatchParent)); |
| | | |
| | | // //viewGroup.AddView(rightLinarLayout, new Android.Views.ViewGroup.LayoutParams(Android.Views.ViewGroup.LayoutParams.WrapContent, Android.Views.ViewGroup.LayoutParams.MatchParent)); |
| | | // viewGroup.AddView(androidDrawerLayout, new Android.Views.ViewGroup.LayoutParams(Android.Views.ViewGroup.LayoutParams.MatchParent, Android.Views.ViewGroup.LayoutParams.MatchParent)); |
| | | // //viewGroup.AddView(lineLinearLayout, new Android.Widget.FrameLayout.LayoutParams(Android.Views.ViewGroup.LayoutParams.MatchParent, DensityUtil.Dip2Px(1), Android.Views.GravityFlags.Bottom)); |
| | | |
| | | |
| | | // } |
| | | |
| | | |
| | | |
| | | // void openLeftMenu() |
| | | // { |
| | | // //if (androidDrawerLayout.isShowRight) |
| | | // //{ |
| | | // // hideRightMenu(); |
| | | // // return; |
| | | // //} |
| | | |
| | | // if (leftLinarLayout.ChildCount == 0) |
| | | // return; |
| | | |
| | | // androidDrawerLayout.isShowLeft = true; |
| | | |
| | | // Android.Widget.FrameLayout.LayoutParams lp = (Android.Widget.FrameLayout.LayoutParams)leftLinarLayout.LayoutParameters; |
| | | // lp.RightMargin = 0; |
| | | // leftLinarLayout.LayoutParameters = lp; |
| | | // leftLinarLayout.Alpha = 1.0f; |
| | | |
| | | |
| | | // if (leftLinarLayout.Animation == null) |
| | | // { |
| | | // leftLinarLayout.Animation = new TranslateAnimation( |
| | | // Dimension.RelativeToSelf, -androidDrawerLayout.LayoutParameters.Width, |
| | | // Dimension.RelativeToSelf, 0, |
| | | // Dimension.RelativeToSelf, 0, |
| | | // Dimension.RelativeToSelf, 0); |
| | | // leftLinarLayout.Animation.Duration = 200; |
| | | // } |
| | | |
| | | // // Animation = leftUIView.Animation; |
| | | // //Animation.Reset(); |
| | | // //Animation.StartNow(); |
| | | |
| | | // leftLinarLayout.Animation.Reset(); |
| | | // leftLinarLayout.Animation.StartNow(); |
| | | |
| | | |
| | | // System.Console.WriteLine("DrawerLayout:openLeftMenu"); |
| | | |
| | | // // UIView.Animate (0.2f, 0.0f, UIViewAnimationOptions.BeginFromCurrentState, () => { |
| | | // // contentView.X = (int)leftUIView.Frame.Width; |
| | | // // leftUIView.Alpha = 1.0f; |
| | | // // }, () => { |
| | | // // |
| | | // // }); |
| | | // } |
| | | |
| | | // void hideLeftMenu() |
| | | // { |
| | | // androidDrawerLayout.isShowLeft = false; |
| | | // Android.Widget.FrameLayout.LayoutParams lp = (Android.Widget.FrameLayout.LayoutParams)leftLinarLayout.LayoutParameters; |
| | | // lp.RightMargin = androidDrawerLayout.LayoutParameters.Width; |
| | | // leftLinarLayout.LayoutParameters = lp; |
| | | // leftLinarLayout.Alpha = 0.0f; |
| | | // // UIView.Animate(0.2f,0.0f,UIViewAnimationOptions.BeginFromCurrentState,()=>{ |
| | | // // contentView.X=0; |
| | | // // leftUIView.Alpha=0.0f; |
| | | // // },()=>{ |
| | | // // |
| | | // // }); |
| | | // } |
| | | |
| | | |
| | | |
| | | |
| | | // /// <summary> |
| | | // /// åè§å¾ç宽度 |
| | | // /// </summary> |
| | | // //int subViewWidth = 100; |
| | | |
| | | // /// <summary> |
| | | // /// å¢å 左边è§å¾ |
| | | // /// </summary> |
| | | // /// <param name="view">View.</param> |
| | | // public void AddLeftView(View view) |
| | | // { |
| | | // leftLinarLayout.AddView(view.AndroidView, new Android.Views.ViewGroup.LayoutParams(androidDrawerLayout.LayoutParameters.Width, androidDrawerLayout.LayoutParameters.Height)); |
| | | // leftLinarLayout.LayoutParameters.Width = androidDrawerLayout.LayoutParameters.Width; |
| | | // view.Parent = this; |
| | | // view.Width = androidDrawerLayout.LayoutParameters.Width; |
| | | // view.Height = androidDrawerLayout.LayoutParameters.Height; |
| | | // } |
| | | |
| | | |
| | | |
| | | |
| | | // class AndroidDrawerLayout : Android.Widget.FrameLayout |
| | | // { |
| | | // View _view; |
| | | // int mTouchSlop |
| | | // { |
| | | // get |
| | | // { |
| | | // var configuration = ViewConfiguration.Get(Context); |
| | | // //æå°çæ»å¨è·ç¦» |
| | | // return configuration.ScaledTouchSlop; |
| | | // } |
| | | // } |
| | | // public AndroidDrawerLayout(Context context, View view) |
| | | // : base(context) |
| | | // { |
| | | // _view = view; |
| | | // } |
| | | |
| | | // float mLastX, mLastY; |
| | | // internal bool isShowLeft; |
| | | // internal bool isShowRight; |
| | | // public Action RightToLeftAction; |
| | | // public Action LeftToRightAction; |
| | | // bool isActioned; |
| | | // bool action(MotionEvent e) |
| | | // { |
| | | // switch (e.Action) |
| | | // { |
| | | // case MotionEventActions.Down: |
| | | // //è®°å½ç¹å»çææ°Xåæ |
| | | // mLastX = e.RawX; |
| | | // mLastY = e.RawY; |
| | | // Parent?.RequestDisallowInterceptTouchEvent(true); |
| | | // break; |
| | | // case MotionEventActions.Move: |
| | | // var x = e.RawX; |
| | | // var y = e.RawY; |
| | | // var deltaX = x - mLastX; |
| | | // var deltaY = y - mLastY; |
| | | // if (Math.Abs(deltaY) < Math.Abs(deltaX)) |
| | | // { |
| | | // if (!isActioned) |
| | | // { |
| | | // //RightToLeftAction |
| | | // if (deltaX < -mTouchSlop) |
| | | // { |
| | | // isActioned = true; |
| | | // //parentDelay(true); |
| | | // System.Console.WriteLine("DrawerLayout:DispatchTouchEvent:RightToLeft"); |
| | | // RightToLeftAction?.Invoke(); |
| | | // } |
| | | // //LeftToRightAction |
| | | // if (mTouchSlop < deltaX) |
| | | // { |
| | | // isActioned = true; |
| | | // //parentDelay(true); |
| | | // System.Console.WriteLine("DrawerLayout:DispatchTouchEvent:LeftToRight"); |
| | | // LeftToRightAction?.Invoke(); |
| | | // } |
| | | // } |
| | | // return true; |
| | | // } |
| | | // else |
| | | // { |
| | | // //ä¸ä¸æ»å¨æ¶ï¼å
è®¸ç¶æ§ä»¶çæ¦æª |
| | | // if (4 < Math.Abs(deltaY)) |
| | | // { |
| | | // Parent?.RequestDisallowInterceptTouchEvent(false); |
| | | // } |
| | | // } |
| | | // break; |
| | | // } |
| | | // return false; |
| | | // } |
| | | |
| | | // /// <summary> |
| | | // /// æ§è¡OnInterceptTouchEventåOnTouchEvent |
| | | // /// </summary> |
| | | // /// <returns><c>true</c>äºä»¶å·²ç»å¤ç<c>false</c>äºä»¶æ²¡æå¤ç</returns> |
| | | // /// <param name="e">E.</param> |
| | | // public override bool DispatchTouchEvent(MotionEvent e) |
| | | // { |
| | | // System.Console.WriteLine($"{GetType()} Height->{Height} Width->{Width} DispatchTouchEvent->{e.Action}"); |
| | | // if (e.Action == MotionEventActions.Down) |
| | | // { |
| | | // isActioned = false; |
| | | // //è¿åå
è®¸æ¦æªäºä»¶ |
| | | // RequestDisallowInterceptTouchEvent(false); |
| | | // } |
| | | // return base.DispatchTouchEvent(e); |
| | | // } |
| | | |
| | | // public override bool OnInterceptTouchEvent(MotionEvent e) |
| | | // { |
| | | // System.Console.WriteLine($"{GetType()} Height->{Height} Width->{Width} OnInterceptTouchEvent->{e.Action}"); |
| | | // if (disallowIntercept) |
| | | // { |
| | | // return false; |
| | | // } |
| | | // if (action(e)) |
| | | // { |
| | | // return true; |
| | | // } |
| | | // return base.OnInterceptTouchEvent(e); |
| | | // } |
| | | |
| | | // /// <summary> |
| | | // /// éåç¹å»äºä»¶ |
| | | // /// </summary> |
| | | // /// <returns><c>true</c>, if touch event was oned, <c>false</c> otherwise.</returns> |
| | | // /// <param name="e">E.</param> |
| | | // public override bool OnTouchEvent(MotionEvent e) |
| | | // { |
| | | // System.Console.WriteLine($"{GetType()} Height->{Height} Width->{Width} OnTouchEvent->{e.Action}"); |
| | | // if (!isActioned) |
| | | // { |
| | | // _view.TouchEvent(e); |
| | | // } |
| | | // action(e); |
| | | // return true; |
| | | // } |
| | | // bool disallowIntercept; |
| | | // public override void RequestDisallowInterceptTouchEvent(bool disallowIntercept) |
| | | // { |
| | | // this.disallowIntercept = disallowIntercept; |
| | | // System.Console.WriteLine($"{GetType()} Height->{Height} RequestDisallowInterceptTouchEvent->{disallowIntercept}"); |
| | | // base.RequestDisallowInterceptTouchEvent(disallowIntercept); |
| | | // Parent?.RequestDisallowInterceptTouchEvent(disallowIntercept); |
| | | // } |
| | | // } |
| | | // } |
| | | //} |
| | | |
| | | |
| | | |
New file |
| | |
| | | using System; |
| | | using System.Collections.Generic; |
| | | using System.Linq; |
| | | using System.Text; |
| | | using Android.App; |
| | | using Android.Content; |
| | | using Android.OS; |
| | | using Android.Runtime; |
| | | using Android.Views; |
| | | using Android.Widget; |
| | | using Android.Util; |
| | | using Android.Views.InputMethods; |
| | | using Android.Text; |
| | | using Android.Graphics.Drawables; |
| | | using Android.Graphics; |
| | | |
| | | namespace Shared |
| | | { |
| | | /// <summary> |
| | | /// EditText |
| | | /// </summary> |
| | | public class EditText : View |
| | | { |
| | | public Action<View, FocusEventArgs> FoucsChanged; |
| | | |
| | | /// <summary> |
| | | /// å½åè§å¾ |
| | | /// </summary> |
| | | /// <value>The android text.</value> |
| | | AndroidEditText currentAndroidEditText |
| | | { |
| | | get |
| | | { |
| | | return AndroidView as AndroidEditText; |
| | | } |
| | | set |
| | | { |
| | | AndroidView = value; |
| | | } |
| | | } |
| | | |
| | | public static EditText Instance; |
| | | |
| | | public Action<View, string> KeyEventAction; |
| | | |
| | | public EditText() |
| | | { |
| | | Instance = this; |
| | | currentAndroidEditText = new AndroidEditText(Application.Activity,this); |
| | | TextSize = Application.FontSize; |
| | | currentAndroidEditText.ViewAttachedToWindow += CurrentAndroidEditText_ViewAttachedToWindow; |
| | | currentAndroidEditText.ViewDetachedFromWindow += CurrentAndroidEditText_ViewDetachedFromWindow; |
| | | } |
| | | |
| | | private void CurrentAndroidEditText_TextChanged(object sender, TextChangedEventArgs e) |
| | | { |
| | | TextChangeEventHandler?.Invoke(this, e.Text.ToString()); |
| | | } |
| | | |
| | | private void CurrentAndroidEditText_FocusChange(object sender, Android.Views.View.FocusChangeEventArgs e) |
| | | { |
| | | FoucsChanged?.Invoke(this, new FocusEventArgs { Focus = e.HasFocus }); |
| | | } |
| | | |
| | | private void CurrentAndroidEditText_EditorAction(object sender, Android.Widget.TextView.EditorActionEventArgs e) |
| | | { |
| | | //if (e.Event == null) |
| | | //{ |
| | | // return; |
| | | //} |
| | | |
| | | if (e.ActionId == ImeAction.Send || |
| | | e.ActionId == ImeAction.Done || |
| | | e.ActionId == ImeAction.Next || |
| | | e.ActionId == ImeAction.Search || |
| | | (e.Event != null && e.Event.Action == KeyEventActions.Down && e.Event.KeyCode == Keycode.Enter)) |
| | | { |
| | | Application.HideSoftInput(); |
| | | EditorEnterAction?.Invoke(this); |
| | | } |
| | | } |
| | | |
| | | private void CurrentAndroidEditText_ViewDetachedFromWindow(object sender, Android.Views.View.ViewDetachedFromWindowEventArgs e) |
| | | { |
| | | ClearAllViewEvent(); |
| | | } |
| | | |
| | | private void CurrentAndroidEditText_ViewAttachedToWindow(object sender, Android.Views.View.ViewAttachedToWindowEventArgs e) |
| | | { |
| | | InitAllViewEvent(); |
| | | } |
| | | |
| | | |
| | | |
| | | internal override void InitAllViewEvent() |
| | | { |
| | | base.InitAllViewEvent(); |
| | | currentAndroidEditText.TextChanged += CurrentAndroidEditText_TextChanged; |
| | | currentAndroidEditText.FocusChange += CurrentAndroidEditText_FocusChange; |
| | | currentAndroidEditText.EditorAction += CurrentAndroidEditText_EditorAction; |
| | | } |
| | | |
| | | internal override void ClearAllViewEvent() |
| | | { |
| | | base.ClearAllViewEvent(); |
| | | currentAndroidEditText.TextChanged -= CurrentAndroidEditText_TextChanged; |
| | | currentAndroidEditText.FocusChange -= CurrentAndroidEditText_FocusChange; |
| | | currentAndroidEditText.EditorAction -= CurrentAndroidEditText_EditorAction; |
| | | |
| | | } |
| | | |
| | | public bool Foucs |
| | | { |
| | | get |
| | | { |
| | | return currentAndroidEditText.IsFocused; |
| | | } |
| | | set |
| | | { |
| | | currentAndroidEditText.Focusable = value; |
| | | currentAndroidEditText.RequestFocus(); |
| | | currentAndroidEditText.FocusableInTouchMode = value; |
| | | currentAndroidEditText.RequestFocusFromTouch(); |
| | | if (value) { |
| | | var imm = (InputMethodManager)Application.Activity.GetSystemService(Context.InputMethodService); |
| | | imm.ShowSoftInput(AndroidView, ShowFlags.Forced); |
| | | } |
| | | } |
| | | |
| | | } |
| | | |
| | | public Action<View> EditorEnterAction; |
| | | /// <summary> |
| | | /// æåå¤§å° |
| | | /// </summary> |
| | | /// <value>The size of the text.</value> |
| | | public float TextSize |
| | | { |
| | | get |
| | | { |
| | | return currentAndroidEditText.TextSize; |
| | | } |
| | | set |
| | | { |
| | | currentAndroidEditText.SetTextSize(ComplexUnitType.Sp, value); |
| | | } |
| | | } |
| | | |
| | | /// <summary> |
| | | /// ææ¬ |
| | | /// </summary> |
| | | /// <value>The text.</value> |
| | | public string Text |
| | | { |
| | | get |
| | | { |
| | | return currentAndroidEditText.Text; |
| | | } |
| | | set |
| | | { |
| | | if (value == null) |
| | | currentAndroidEditText.Text = ""; |
| | | else |
| | | currentAndroidEditText.Text = value.TrimEnd('\0'); |
| | | } |
| | | } |
| | | int textID; |
| | | /// <summary> |
| | | /// æ ¹æ®IDè·å对åºç夿³¨ |
| | | /// </summary> |
| | | /// <value>The text I.</value> |
| | | public int TextID |
| | | { |
| | | get |
| | | { |
| | | return textID; |
| | | } |
| | | set |
| | | { |
| | | textID = value; |
| | | Text = Language.StringByID(TextID); |
| | | } |
| | | } |
| | | |
| | | /// <summary> |
| | | /// æ¯å¦ä½¿è½ |
| | | /// </summary> |
| | | /// <value>true</value> |
| | | /// <c>false</c> |
| | | public override bool Enable |
| | | { |
| | | get |
| | | { |
| | | return currentAndroidEditText.Enabled; |
| | | } |
| | | set |
| | | { |
| | | currentAndroidEditText.Enabled = value; |
| | | } |
| | | } |
| | | |
| | | /// <summary> |
| | | /// æ¾ç¤ºæç¤ºä¿¡æ¯ |
| | | /// </summary> |
| | | /// <value>The placeholder.</value> |
| | | public string PlaceholderText |
| | | { |
| | | get |
| | | { |
| | | return currentAndroidEditText.Hint; |
| | | } |
| | | set |
| | | { |
| | | currentAndroidEditText.Hint = value; |
| | | } |
| | | } |
| | | |
| | | uint placeholderTextColor; |
| | | /// <summary> |
| | | /// Gets or sets the color of the placeholder text. |
| | | /// </summary> |
| | | /// <value>The color of the placeholder text.</value> |
| | | public uint PlaceholderTextColor |
| | | { |
| | | get |
| | | { |
| | | return placeholderTextColor; |
| | | } |
| | | set |
| | | { |
| | | placeholderTextColor = value; |
| | | byte r, g, b, a; |
| | | r = (byte)(placeholderTextColor / 256 / 256 % 256); |
| | | g = (byte)(placeholderTextColor / 256 % 256); |
| | | b = (byte)(placeholderTextColor % 256); |
| | | a = (byte)(placeholderTextColor / 256 / 256 / 256 % 256); |
| | | currentAndroidEditText.SetHintTextColor(Android.Graphics.Color.Argb(a, r, g, b)); |
| | | } |
| | | } |
| | | |
| | | |
| | | /// <summary> |
| | | /// æ¯å¦ç¨*å·éèå符 |
| | | /// </summary> |
| | | /// <value>The secure text entry.</value> |
| | | public bool SecureTextEntry |
| | | { |
| | | get |
| | | { |
| | | return currentAndroidEditText.InputType != InputTypes.TextVariationVisiblePassword; |
| | | } |
| | | set |
| | | { |
| | | if (value) |
| | | { |
| | | currentAndroidEditText.InputType = InputTypes.ClassText | InputTypes.TextVariationPassword; |
| | | } |
| | | else |
| | | { |
| | | currentAndroidEditText.InputType = InputTypes.TextVariationVisiblePassword; |
| | | } |
| | | } |
| | | } |
| | | |
| | | bool isSelected; |
| | | /// <summary> |
| | | /// Gets or sets a value indicating whether this instance is selected. |
| | | /// </summary> |
| | | /// <value><c>true</c> if this instance is selected; otherwise, <c>false</c>.</value> |
| | | public bool IsSelected |
| | | { |
| | | get |
| | | { |
| | | return isSelected; |
| | | } |
| | | set |
| | | { |
| | | isSelected = value; |
| | | |
| | | if (!IsCanRefresh) { |
| | | return; |
| | | } |
| | | if (isSelected) |
| | | { |
| | | if (SelectedImagePath == null) |
| | | { |
| | | SelectedBackgroundColor = SelectedBackgroundColor; |
| | | } |
| | | else |
| | | { |
| | | if (!Background(SelectedImagePath)) |
| | | { |
| | | BackgroundColor = BackgroundColor; |
| | | } |
| | | } |
| | | } |
| | | else |
| | | { |
| | | if (UnSelectedImagePath == null) |
| | | { |
| | | BackgroundColor = BackgroundColor; |
| | | } |
| | | else |
| | | { |
| | | if (!Background(UnSelectedImagePath)) |
| | | { |
| | | BackgroundColor = BackgroundColor; |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | | |
| | | uint selectedBackgroundColor; |
| | | /// <summary> |
| | | /// éæ©æ¶èæ¯é¢è² |
| | | /// </summary> |
| | | /// <value>The color of the text.</value> |
| | | public uint SelectedBackgroundColor |
| | | { |
| | | get |
| | | { |
| | | return selectedBackgroundColor; |
| | | } |
| | | set |
| | | { |
| | | selectedBackgroundColor = value; |
| | | if (AndroidView.Background == null || AndroidView.Background.GetType() != typeof(GradientDrawable)) |
| | | { |
| | | AndroidView.Background = new Android.Graphics.Drawables.GradientDrawable(); |
| | | } |
| | | |
| | | var gradientDrawable = (GradientDrawable)AndroidView.Background; |
| | | gradientDrawable.SetCornerRadius(DensityUtil.Dip2Px(Radius)); |
| | | byte r, g, b, a; |
| | | r = (byte)(BorderColor / 256 / 256 % 256); |
| | | g = (byte)(BorderColor / 256 % 256); |
| | | b = (byte)(BorderColor % 256); |
| | | a = (byte)(BorderColor / 256 / 256 / 256 % 256); |
| | | gradientDrawable.SetStroke((int)BorderWidth, Android.Graphics.Color.Argb(a, r, g, b)); |
| | | |
| | | r = (byte)(selectedBackgroundColor / 256 / 256 % 256); |
| | | g = (byte)(selectedBackgroundColor / 256 % 256); |
| | | b = (byte)(selectedBackgroundColor % 256); |
| | | a = (byte)(selectedBackgroundColor / 256 / 256 / 256 % 256); |
| | | gradientDrawable.SetColor(Android.Graphics.Color.Argb(a, r, g, b).ToArgb()); |
| | | } |
| | | |
| | | } |
| | | |
| | | /// <summary> |
| | | /// å·æ°å¤§å° |
| | | /// </summary> |
| | | public override void Refresh() |
| | | { |
| | | base.Refresh(); |
| | | IsSelected = isSelected; |
| | | } |
| | | |
| | | uint textColor; |
| | | /// <summary> |
| | | /// æåé¢è² |
| | | /// </summary> |
| | | /// <value>The color of the text.</value> |
| | | public uint TextColor |
| | | { |
| | | get |
| | | { |
| | | return textColor; |
| | | } |
| | | set |
| | | { |
| | | textColor = value; |
| | | byte r, g, b, a; |
| | | r = (byte)(textColor / 256 / 256 % 256); |
| | | g = (byte)(textColor / 256 % 256); |
| | | b = (byte)(textColor % 256); |
| | | a = (byte)(textColor / 256 / 256 / 256 % 256); |
| | | currentAndroidEditText.SetTextColor(Android.Graphics.Color.Argb(a, r, g, b)); |
| | | } |
| | | } |
| | | |
| | | public static int FocusBottom{ |
| | | get{ |
| | | return AndroidEditText.Bottom; |
| | | } |
| | | } |
| | | //大家æ°å¹´å¥½ï¼ç¼è¯äººç代ç ï¼è¿è¡å¹¸ç¦ç¨åºï¼å级åºç¨åè½ï¼è¶
åºé¡¹ç®éæ±ã2019å¹´ï¼ä½ çå¹¸ç¦æ°æ®å¨å è½½ä¸ããããã |
| | | TextAlignment textAlignment = TextAlignment.Center; |
| | | /// <summary> |
| | | /// Texts the alignment. |
| | | /// </summary> |
| | | /// <param name="horizontalAlignment">Horizontal alignment.</param> |
| | | /// <param name="verticalAlignment">Vertical alignment.</param> |
| | | public TextAlignment TextAlignment |
| | | { |
| | | get |
| | | { |
| | | return textAlignment; |
| | | } |
| | | set |
| | | { |
| | | textAlignment = value; |
| | | switch (value) |
| | | { |
| | | case TextAlignment.TopLeft: |
| | | currentAndroidEditText.Gravity = GravityFlags.Top | GravityFlags.Left; |
| | | break; |
| | | case TextAlignment.TopCenter: |
| | | currentAndroidEditText.Gravity = GravityFlags.Top | GravityFlags.Center; |
| | | break; |
| | | case TextAlignment.TopRight: |
| | | currentAndroidEditText.Gravity = GravityFlags.Top | GravityFlags.Right; |
| | | break; |
| | | case TextAlignment.CenterLeft: |
| | | currentAndroidEditText.Gravity = GravityFlags.Center | GravityFlags.Left; |
| | | break; |
| | | case TextAlignment.Center: |
| | | currentAndroidEditText.Gravity = GravityFlags.Center | GravityFlags.Center; |
| | | break; |
| | | case TextAlignment.CenterRight: |
| | | currentAndroidEditText.Gravity = GravityFlags.Center | GravityFlags.Right; |
| | | break; |
| | | case TextAlignment.BottomLeft: |
| | | currentAndroidEditText.Gravity = GravityFlags.Bottom | GravityFlags.Left; |
| | | break; |
| | | case TextAlignment.BottomCenter: |
| | | currentAndroidEditText.Gravity = GravityFlags.Bottom | GravityFlags.Center; |
| | | break; |
| | | case TextAlignment.BottomRight: |
| | | currentAndroidEditText.Gravity = GravityFlags.Bottom | GravityFlags.Right; |
| | | break; |
| | | } |
| | | } |
| | | |
| | | } |
| | | |
| | | /// <summary> |
| | | /// éæ©æ¶èæ¯å¾è·¯å¾ |
| | | /// </summary> |
| | | /// <value>The selected image path.</value> |
| | | public string SelectedImagePath { get; set; } |
| | | |
| | | /// <summary> |
| | | /// ééä¸ç¶æçèæ¯å¾è·¯å¾ |
| | | /// </summary> |
| | | /// <value>The un selected image path.</value> |
| | | public string UnSelectedImagePath { get; set; } |
| | | |
| | | /// <summary> |
| | | /// è¾å
¥æåååäºä»¶ |
| | | /// </summary> |
| | | public Action<View, string> TextChangeEventHandler; |
| | | |
| | | public void SetSingleLine(bool bSingle, int maxLines = 3) |
| | | { |
| | | currentAndroidEditText.SetSingleLine(bSingle); |
| | | if (!bSingle) { |
| | | currentAndroidEditText.SetMaxLines(maxLines); |
| | | } |
| | | } |
| | | |
| | | |
| | | class AndroidEditText : Android.Widget.EditText |
| | | { |
| | | EditText editText; |
| | | public AndroidEditText(Context context,EditText editText) |
| | | : base(context) |
| | | { |
| | | SetTextColor(Android.Graphics.Color.White); |
| | | SetPadding(0, 0, 0, 0); |
| | | TextAlignment = Android.Views.TextAlignment.Center; |
| | | SetSingleLine(true); |
| | | this.editText = editText; |
| | | } |
| | | |
| | | protected override void OnFocusChanged (bool gainFocus, [GeneratedEnum] FocusSearchDirection direction, Rect previouslyFocusedRect) |
| | | { |
| | | base.OnFocusChanged (gainFocus, direction, previouslyFocusedRect); |
| | | var location = new int[2]; |
| | | this.GetLocationOnScreen(location); |
| | | if (gainFocus) { |
| | | Bottom = location [1] + this.Height; |
| | | } |
| | | else{ |
| | | Bottom = 0; |
| | | } |
| | | } |
| | | |
| | | public override bool OnKeyDown([GeneratedEnum] Keycode keyCode, KeyEvent e) |
| | | { |
| | | if (e != null && e.KeyCode == Keycode.Del && e.Action == KeyEventActions.Down) |
| | | { |
| | | editText?.KeyEventAction?.Invoke(editText,"Del"); |
| | | } |
| | | return base.OnKeyDown(keyCode, e); |
| | | } |
| | | |
| | | |
| | | |
| | | |
| | | public static int Bottom; |
| | | |
| | | |
| | | //public override Android.Views.InputMethods.IInputConnection OnCreateInputConnection(Android.Views.InputMethods.EditorInfo outAttrs) |
| | | //{ |
| | | // return new ZanyInputConnection(base.OnCreateInputConnection(outAttrs), true,this); |
| | | //} |
| | | |
| | | |
| | | //class ZanyInputConnection : InputConnectionWrapper,ISpannable |
| | | //{ |
| | | // AndroidEditText androidEditText; |
| | | // public ZanyInputConnection(IInputConnection target, bool mutable,AndroidEditText androidText):base(target,mutable) |
| | | // { |
| | | // this.androidEditText = androidText; |
| | | // } |
| | | // public override bool SendKeyEvent(KeyEvent e) |
| | | // { |
| | | // if (e.Action == KeyEventActions.Down && e.KeyCode == Keycode.Del) |
| | | // { |
| | | |
| | | // string text = androidEditText.Text; |
| | | // if (text.Length > 0) |
| | | // { |
| | | // string newText = text.Substring(0, text.Length - 1); |
| | | // androidEditText.Text=newText; |
| | | // Selection.SetSelection(this, newText.Length); |
| | | // } |
| | | // return false; |
| | | // } |
| | | // return base.SendKeyEvent(e); |
| | | // } |
| | | |
| | | //} |
| | | } |
| | | } |
| | | public class FocusEventArgs : EventArgs |
| | | { |
| | | /// <summary> |
| | | /// true 为è·åå°ç¦ç¹ |
| | | /// false ç¦ç¹æ¶å¤± |
| | | /// </summary> |
| | | public bool Focus; |
| | | } |
| | | } |
| | | |
| | | |
New file |
| | |
| | | using System; |
| | | using Android.Content; |
| | | using Android.Runtime; |
| | | using Android.Views; |
| | | using Android.Util; |
| | | using Android.Views.InputMethods; |
| | | using Android.Text; |
| | | using Android.Graphics.Drawables; |
| | | using Android.Graphics; |
| | | |
| | | namespace Shared |
| | | { |
| | | /// <summary> |
| | | /// EditTextView ææ¬è¾å
¥æ¡ |
| | | /// æ¯ææ¢è¡ |
| | | /// </summary> |
| | | public class EditTextView : View |
| | | { |
| | | public Action<View, FocusEventArgs> FoucsChanged; |
| | | |
| | | /// <summary> |
| | | /// å½åè§å¾ |
| | | /// </summary> |
| | | /// <value>The android text.</value> |
| | | AndroidEditText currentAndroidEditText |
| | | { |
| | | get |
| | | { |
| | | return AndroidView as AndroidEditText; |
| | | } |
| | | set |
| | | { |
| | | AndroidView = value; |
| | | } |
| | | } |
| | | |
| | | public static EditTextView Instance; |
| | | |
| | | public Action<View, string> KeyEventAction; |
| | | |
| | | public EditTextView() |
| | | { |
| | | Instance = this; |
| | | currentAndroidEditText = new AndroidEditText(Application.Activity,this); |
| | | //currentAndroidEditText.SetSingleLine(false); |
| | | //currentAndroidEditText.SetMaxLines(10); |
| | | //TextSize = Application.FontSize; |
| | | TextSize = 14; |
| | | currentAndroidEditText.ViewAttachedToWindow += CurrentAndroidEditText_ViewAttachedToWindow; |
| | | currentAndroidEditText.ViewDetachedFromWindow += CurrentAndroidEditText_ViewDetachedFromWindow; |
| | | } |
| | | |
| | | private void CurrentAndroidEditText_TextChanged(object sender, TextChangedEventArgs e) |
| | | { |
| | | TextChangeEventHandler?.Invoke(this, e.Text.ToString()); |
| | | } |
| | | |
| | | private void CurrentAndroidEditText_FocusChange(object sender, Android.Views.View.FocusChangeEventArgs e) |
| | | { |
| | | FoucsChanged?.Invoke(this, new FocusEventArgs { Focus = e.HasFocus }); |
| | | } |
| | | |
| | | //private void CurrentAndroidEditText_EditorAction(object sender, Android.Widget.TextView.EditorActionEventArgs e) |
| | | //{ |
| | | // //if (e.Event == null) |
| | | // //{ |
| | | // // return; |
| | | // //} |
| | | |
| | | // if (e.ActionId == ImeAction.Send || |
| | | // e.ActionId == ImeAction.Done || |
| | | // e.ActionId == ImeAction.Next || |
| | | // e.ActionId == ImeAction.Search || |
| | | // (e.Event != null && e.Event.Action == KeyEventActions.Down && e.Event.KeyCode == Keycode.Enter)) |
| | | // { |
| | | // //Application.HideSoftInput(); |
| | | // //EditorEnterAction?.Invoke(this); |
| | | |
| | | // } |
| | | //} |
| | | |
| | | private void CurrentAndroidEditText_ViewDetachedFromWindow(object sender, Android.Views.View.ViewDetachedFromWindowEventArgs e) |
| | | { |
| | | ClearAllViewEvent(); |
| | | } |
| | | |
| | | private void CurrentAndroidEditText_ViewAttachedToWindow(object sender, Android.Views.View.ViewAttachedToWindowEventArgs e) |
| | | { |
| | | InitAllViewEvent(); |
| | | } |
| | | |
| | | |
| | | |
| | | internal override void InitAllViewEvent() |
| | | { |
| | | base.InitAllViewEvent(); |
| | | currentAndroidEditText.TextChanged += CurrentAndroidEditText_TextChanged; |
| | | currentAndroidEditText.FocusChange += CurrentAndroidEditText_FocusChange; |
| | | //currentAndroidEditText.EditorAction += CurrentAndroidEditText_EditorAction; |
| | | } |
| | | |
| | | internal override void ClearAllViewEvent() |
| | | { |
| | | base.ClearAllViewEvent(); |
| | | currentAndroidEditText.TextChanged -= CurrentAndroidEditText_TextChanged; |
| | | currentAndroidEditText.FocusChange -= CurrentAndroidEditText_FocusChange; |
| | | //currentAndroidEditText.EditorAction -= CurrentAndroidEditText_EditorAction; |
| | | |
| | | } |
| | | |
| | | public bool Foucs |
| | | { |
| | | get |
| | | { |
| | | return currentAndroidEditText.IsFocused; |
| | | } |
| | | set |
| | | { |
| | | currentAndroidEditText.Focusable = value; |
| | | currentAndroidEditText.RequestFocus(); |
| | | currentAndroidEditText.FocusableInTouchMode = value; |
| | | currentAndroidEditText.RequestFocusFromTouch(); |
| | | if (value) { |
| | | var imm = (InputMethodManager)Application.Activity.GetSystemService(Context.InputMethodService); |
| | | imm.ShowSoftInput(AndroidView, ShowFlags.Forced); |
| | | } |
| | | } |
| | | |
| | | } |
| | | |
| | | public Action<View> EditorEnterAction; |
| | | /// <summary> |
| | | /// æåå¤§å° |
| | | /// </summary> |
| | | /// <value>The size of the text.</value> |
| | | public float TextSize |
| | | { |
| | | get |
| | | { |
| | | return currentAndroidEditText.TextSize; |
| | | } |
| | | set |
| | | { |
| | | currentAndroidEditText.SetTextSize(ComplexUnitType.Sp, value); |
| | | } |
| | | } |
| | | |
| | | /// <summary> |
| | | /// ææ¬ |
| | | /// </summary> |
| | | /// <value>The text.</value> |
| | | public string Text |
| | | { |
| | | get |
| | | { |
| | | return currentAndroidEditText.Text; |
| | | } |
| | | set |
| | | { |
| | | if (value == null) |
| | | currentAndroidEditText.Text = ""; |
| | | else |
| | | currentAndroidEditText.Text = value.TrimEnd('\0'); |
| | | } |
| | | } |
| | | int textID; |
| | | /// <summary> |
| | | /// æ ¹æ®IDè·å对åºç夿³¨ |
| | | /// </summary> |
| | | /// <value>The text I.</value> |
| | | public int TextID |
| | | { |
| | | get |
| | | { |
| | | return textID; |
| | | } |
| | | set |
| | | { |
| | | textID = value; |
| | | Text = Language.StringByID(TextID); |
| | | } |
| | | } |
| | | |
| | | int _MaxLength = 1000; |
| | | public int MaxLength |
| | | { |
| | | |
| | | get |
| | | { |
| | | return _MaxLength; |
| | | } |
| | | set |
| | | { |
| | | _MaxLength = value; |
| | | |
| | | } |
| | | |
| | | } |
| | | |
| | | /// <summary> |
| | | /// æ¯å¦ä½¿è½ |
| | | /// </summary> |
| | | /// <value>true</value> |
| | | /// <c>false</c> |
| | | public override bool Enable |
| | | { |
| | | get |
| | | { |
| | | return currentAndroidEditText.Enabled; |
| | | } |
| | | set |
| | | { |
| | | currentAndroidEditText.Enabled = value; |
| | | } |
| | | } |
| | | |
| | | /// <summary> |
| | | /// æ¾ç¤ºæç¤ºä¿¡æ¯ |
| | | /// </summary> |
| | | /// <value>The placeholder.</value> |
| | | public string PlaceholderText |
| | | { |
| | | get |
| | | { |
| | | return currentAndroidEditText.Hint; |
| | | } |
| | | set |
| | | { |
| | | currentAndroidEditText.Hint = value; |
| | | } |
| | | } |
| | | |
| | | uint placeholderTextColor; |
| | | /// <summary> |
| | | /// Gets or sets the color of the placeholder text. |
| | | /// </summary> |
| | | /// <value>The color of the placeholder text.</value> |
| | | public uint PlaceholderTextColor |
| | | { |
| | | get |
| | | { |
| | | return placeholderTextColor; |
| | | } |
| | | set |
| | | { |
| | | placeholderTextColor = value; |
| | | byte r, g, b, a; |
| | | r = (byte)(placeholderTextColor / 256 / 256 % 256); |
| | | g = (byte)(placeholderTextColor / 256 % 256); |
| | | b = (byte)(placeholderTextColor % 256); |
| | | a = (byte)(placeholderTextColor / 256 / 256 / 256 % 256); |
| | | currentAndroidEditText.SetHintTextColor(Android.Graphics.Color.Argb(a, r, g, b)); |
| | | } |
| | | } |
| | | |
| | | |
| | | /// <summary> |
| | | /// æ¯å¦ç¨*å·éèå符 |
| | | /// </summary> |
| | | /// <value>The secure text entry.</value> |
| | | public bool SecureTextEntry |
| | | { |
| | | get |
| | | { |
| | | return currentAndroidEditText.InputType != InputTypes.TextVariationVisiblePassword; |
| | | } |
| | | set |
| | | { |
| | | if (value) |
| | | { |
| | | currentAndroidEditText.InputType = InputTypes.ClassText | InputTypes.TextVariationPassword; |
| | | } |
| | | else |
| | | { |
| | | currentAndroidEditText.InputType = InputTypes.TextVariationVisiblePassword; |
| | | } |
| | | } |
| | | } |
| | | |
| | | bool isSelected; |
| | | /// <summary> |
| | | /// Gets or sets a value indicating whether this instance is selected. |
| | | /// </summary> |
| | | /// <value><c>true</c> if this instance is selected; otherwise, <c>false</c>.</value> |
| | | public bool IsSelected |
| | | { |
| | | get |
| | | { |
| | | return isSelected; |
| | | } |
| | | set |
| | | { |
| | | isSelected = value; |
| | | |
| | | if (!IsCanRefresh) { |
| | | return; |
| | | } |
| | | if (isSelected) |
| | | { |
| | | if (SelectedImagePath == null) |
| | | { |
| | | SelectedBackgroundColor = SelectedBackgroundColor; |
| | | } |
| | | else |
| | | { |
| | | if (!Background(SelectedImagePath)) |
| | | { |
| | | BackgroundColor = BackgroundColor; |
| | | } |
| | | } |
| | | } |
| | | else |
| | | { |
| | | if (UnSelectedImagePath == null) |
| | | { |
| | | BackgroundColor = BackgroundColor; |
| | | } |
| | | else |
| | | { |
| | | if (!Background(UnSelectedImagePath)) |
| | | { |
| | | BackgroundColor = BackgroundColor; |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | | |
| | | uint selectedBackgroundColor; |
| | | /// <summary> |
| | | /// éæ©æ¶èæ¯é¢è² |
| | | /// </summary> |
| | | /// <value>The color of the text.</value> |
| | | public uint SelectedBackgroundColor |
| | | { |
| | | get |
| | | { |
| | | return selectedBackgroundColor; |
| | | } |
| | | set |
| | | { |
| | | selectedBackgroundColor = value; |
| | | if (AndroidView.Background == null || AndroidView.Background.GetType() != typeof(GradientDrawable)) |
| | | { |
| | | AndroidView.Background = new Android.Graphics.Drawables.GradientDrawable(); |
| | | } |
| | | |
| | | var gradientDrawable = (GradientDrawable)AndroidView.Background; |
| | | gradientDrawable.SetCornerRadius(DensityUtil.Dip2Px(Radius)); |
| | | byte r, g, b, a; |
| | | r = (byte)(BorderColor / 256 / 256 % 256); |
| | | g = (byte)(BorderColor / 256 % 256); |
| | | b = (byte)(BorderColor % 256); |
| | | a = (byte)(BorderColor / 256 / 256 / 256 % 256); |
| | | gradientDrawable.SetStroke((int)BorderWidth, Android.Graphics.Color.Argb(a, r, g, b)); |
| | | |
| | | r = (byte)(selectedBackgroundColor / 256 / 256 % 256); |
| | | g = (byte)(selectedBackgroundColor / 256 % 256); |
| | | b = (byte)(selectedBackgroundColor % 256); |
| | | a = (byte)(selectedBackgroundColor / 256 / 256 / 256 % 256); |
| | | gradientDrawable.SetColor(Android.Graphics.Color.Argb(a, r, g, b).ToArgb()); |
| | | } |
| | | |
| | | } |
| | | |
| | | /// <summary> |
| | | /// å·æ°å¤§å° |
| | | /// </summary> |
| | | public override void Refresh() |
| | | { |
| | | base.Refresh(); |
| | | IsSelected = isSelected; |
| | | } |
| | | |
| | | uint textColor; |
| | | /// <summary> |
| | | /// æåé¢è² |
| | | /// </summary> |
| | | /// <value>The color of the text.</value> |
| | | public uint TextColor |
| | | { |
| | | get |
| | | { |
| | | return textColor; |
| | | } |
| | | set |
| | | { |
| | | textColor = value; |
| | | byte r, g, b, a; |
| | | r = (byte)(textColor / 256 / 256 % 256); |
| | | g = (byte)(textColor / 256 % 256); |
| | | b = (byte)(textColor % 256); |
| | | a = (byte)(textColor / 256 / 256 / 256 % 256); |
| | | currentAndroidEditText.SetTextColor(Android.Graphics.Color.Argb(a, r, g, b)); |
| | | } |
| | | } |
| | | |
| | | public static int FocusBottom{ |
| | | get{ |
| | | return AndroidEditText.Bottom; |
| | | } |
| | | } |
| | | //大家æ°å¹´å¥½ï¼ç¼è¯äººç代ç ï¼è¿è¡å¹¸ç¦ç¨åºï¼å级åºç¨åè½ï¼è¶
åºé¡¹ç®éæ±ã2019å¹´ï¼ä½ çå¹¸ç¦æ°æ®å¨å è½½ä¸ããããã |
| | | TextAlignment textAlignment = TextAlignment.Center; |
| | | /// <summary> |
| | | /// Texts the alignment. |
| | | /// </summary> |
| | | /// <param name="horizontalAlignment">Horizontal alignment.</param> |
| | | /// <param name="verticalAlignment">Vertical alignment.</param> |
| | | public TextAlignment TextAlignment |
| | | { |
| | | get |
| | | { |
| | | return textAlignment; |
| | | } |
| | | set |
| | | { |
| | | textAlignment = value; |
| | | switch (value) |
| | | { |
| | | case TextAlignment.TopLeft: |
| | | currentAndroidEditText.Gravity = GravityFlags.Top | GravityFlags.Left; |
| | | break; |
| | | case TextAlignment.TopCenter: |
| | | currentAndroidEditText.Gravity = GravityFlags.Top | GravityFlags.Center; |
| | | break; |
| | | case TextAlignment.TopRight: |
| | | currentAndroidEditText.Gravity = GravityFlags.Top | GravityFlags.Right; |
| | | break; |
| | | case TextAlignment.CenterLeft: |
| | | currentAndroidEditText.Gravity = GravityFlags.Center | GravityFlags.Left; |
| | | break; |
| | | case TextAlignment.Center: |
| | | currentAndroidEditText.Gravity = GravityFlags.Center | GravityFlags.Center; |
| | | break; |
| | | case TextAlignment.CenterRight: |
| | | currentAndroidEditText.Gravity = GravityFlags.Center | GravityFlags.Right; |
| | | break; |
| | | case TextAlignment.BottomLeft: |
| | | currentAndroidEditText.Gravity = GravityFlags.Bottom | GravityFlags.Left; |
| | | break; |
| | | case TextAlignment.BottomCenter: |
| | | currentAndroidEditText.Gravity = GravityFlags.Bottom | GravityFlags.Center; |
| | | break; |
| | | case TextAlignment.BottomRight: |
| | | currentAndroidEditText.Gravity = GravityFlags.Bottom | GravityFlags.Right; |
| | | break; |
| | | } |
| | | } |
| | | |
| | | } |
| | | |
| | | /// <summary> |
| | | /// éæ©æ¶èæ¯å¾è·¯å¾ |
| | | /// </summary> |
| | | /// <value>The selected image path.</value> |
| | | public string SelectedImagePath { get; set; } |
| | | |
| | | /// <summary> |
| | | /// ééä¸ç¶æçèæ¯å¾è·¯å¾ |
| | | /// </summary> |
| | | /// <value>The un selected image path.</value> |
| | | public string UnSelectedImagePath { get; set; } |
| | | |
| | | /// <summary> |
| | | /// è¾å
¥æåååäºä»¶ |
| | | /// </summary> |
| | | public Action<View, string> TextChangeEventHandler; |
| | | |
| | | public void SetSingleLine(bool bSingle, int maxLines = 0) |
| | | { |
| | | currentAndroidEditText.SetSingleLine(bSingle); |
| | | if (!bSingle) { |
| | | currentAndroidEditText.SetMaxLines(maxLines); |
| | | } |
| | | } |
| | | |
| | | /// <summary> |
| | | /// å·æ°placeholderUILabelå¸å± |
| | | /// </summary> |
| | | public void InitIosPlaceholderUILabelWithHeight(int mHeight) |
| | | { |
| | | } |
| | | |
| | | public void HideSoftInput() |
| | | { |
| | | var imm = (Android.Views.InputMethods.InputMethodManager)Application.Activity.GetSystemService(Context.InputMethodService); |
| | | if (Shared.EditTextView.Instance != null) |
| | | { |
| | | imm.HideSoftInputFromWindow(Shared.EditTextView.Instance.AndroidView.WindowToken, 0); //强å¶éèé®ç |
| | | } |
| | | else |
| | | { |
| | | imm.ToggleSoftInput(0, Android.Views.InputMethods.HideSoftInputFlags.NotAlways); |
| | | } |
| | | } |
| | | |
| | | class AndroidEditText : Android.Widget.EditText |
| | | { |
| | | EditTextView editText; |
| | | public AndroidEditText(Context context, EditTextView editText) |
| | | : base(context) |
| | | { |
| | | SetTextColor(Android.Graphics.Color.White); |
| | | SetPadding(10, 10, 10, 10); |
| | | TextAlignment = Android.Views.TextAlignment.Center; |
| | | Gravity = GravityFlags.Top | GravityFlags.Left; |
| | | SetSingleLine(false); |
| | | SetMaxLines(20); |
| | | this.editText = editText; |
| | | } |
| | | |
| | | protected override void OnFocusChanged (bool gainFocus, [GeneratedEnum] FocusSearchDirection direction, Rect previouslyFocusedRect) |
| | | { |
| | | base.OnFocusChanged (gainFocus, direction, previouslyFocusedRect); |
| | | var location = new int[2]; |
| | | this.GetLocationOnScreen(location); |
| | | if (gainFocus) { |
| | | Bottom = location [1] + this.Height; |
| | | } |
| | | else{ |
| | | Bottom = 0; |
| | | } |
| | | } |
| | | |
| | | //public override bool OnKeyDown([GeneratedEnum] Keycode keyCode, KeyEvent e) |
| | | //{ |
| | | // if (e != null && e.KeyCode == Keycode.Del && e.Action == KeyEventActions.Down) |
| | | // { |
| | | // editText?.KeyEventAction?.Invoke(editText,"Del"); |
| | | // } |
| | | // return base.OnKeyDown(keyCode, e); |
| | | //} |
| | | |
| | | |
| | | |
| | | |
| | | public static int Bottom; |
| | | |
| | | } |
| | | |
| | | } |
| | | |
| | | } |
| | | |
| | | |
New file |
| | |
| | |  |
| | | 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, |
| | | |
| | | } |
| | | |
| | | |
| | | } |
| | | |
| | | |
New file |
| | |
| | | using System; |
| | | using Android.Views; |
| | | using Android.Content; |
| | | using Android.Util; |
| | | using Android.Runtime; |
| | | |
| | | namespace Shared |
| | | { |
| | | //å·²ç»å
¨é¢æ£æ¥äºä»£ç |
| | | /// <summary> |
| | | /// ç»å¯¹å¸å± |
| | | /// </summary> |
| | | public class FrameLayout : ViewGroup |
| | | { |
| | | /// <summary> |
| | | /// å½åè§å¾ |
| | | /// </summary> |
| | | public FrameLayout () |
| | | { |
| | | viewGroup = new AndroidFrameLayout (Application.Activity, this); |
| | | realViewGroup = viewGroup; |
| | | } |
| | | /// <summary> |
| | | /// ä»¥ä¼ è¿æ¥ç对象为å½å对象 |
| | | /// </summary> |
| | | /// <param name="frameLayout">Frame layout.</param> |
| | | internal FrameLayout (Android.Widget.FrameLayout frameLayout) |
| | | { |
| | | viewGroup = frameLayout; |
| | | realViewGroup = viewGroup; |
| | | } |
| | | } |
| | | //å·²ç»å
¨é¢æ£æ¥äºä»£ç |
| | | /// <summary> |
| | | /// Androidåçç»å¯¹å¸å±è§å¾ FrameLayout |
| | | /// </summary> |
| | | class AndroidFrameLayout : Android.Widget.FrameLayout |
| | | { |
| | | View _view; |
| | | public AndroidFrameLayout(Context context,View view) |
| | | : base(context) |
| | | { |
| | | _view = view; |
| | | } |
| | | public override bool OnTouchEvent(MotionEvent e) |
| | | { |
| | | base.OnTouchEvent(e); |
| | | _view?.TouchEvent(e); |
| | | return true; |
| | | } |
| | | bool disallowIntercept; |
| | | public override void RequestDisallowInterceptTouchEvent(bool disallowIntercept) |
| | | { |
| | | this.disallowIntercept = disallowIntercept; |
| | | //System.Console.WriteLine($"{GetType()} Height->{Height} RequestDisallowInterceptTouchEvent->{disallowIntercept}"); |
| | | base.RequestDisallowInterceptTouchEvent(disallowIntercept); |
| | | Parent?.RequestDisallowInterceptTouchEvent(disallowIntercept); |
| | | } |
| | | } |
| | | |
| | | //å·²ç»å
¨é¢æ£æ¥äºä»£ç |
| | | /// <summary> |
| | | /// å·²ç»å
¨é¢æ£æ¥ä»£ç |
| | | /// </summary> |
| | | class AndroidLinearLayout : Android.Widget.LinearLayout |
| | | { |
| | | View _view; |
| | | public AndroidLinearLayout (Context context, View view) |
| | | : base (context) |
| | | { |
| | | _view = view; |
| | | } |
| | | public override bool OnTouchEvent(MotionEvent e) |
| | | { |
| | | base.OnTouchEvent(e); |
| | | _view?.TouchEvent(e); |
| | | return true; |
| | | } |
| | | |
| | | bool disallowIntercept; |
| | | public override void RequestDisallowInterceptTouchEvent(bool disallowIntercept) |
| | | { |
| | | this.disallowIntercept = disallowIntercept; |
| | | System.Console.WriteLine($"{GetType()} Height->{Height} RequestDisallowInterceptTouchEvent->{disallowIntercept}"); |
| | | base.RequestDisallowInterceptTouchEvent(disallowIntercept); |
| | | Parent?.RequestDisallowInterceptTouchEvent(disallowIntercept); |
| | | } |
| | | |
| | | } |
| | | } |
New file |
| | |
| | | using System; |
| | | using System.Collections.Generic; |
| | | using Android.Content; |
| | | using Com.Hdl.Widget.Gdmapkit; |
| | | |
| | | namespace Shared |
| | | { |
| | | public class GDMapKit |
| | | { |
| | | |
| | | public static void Show(Action<double, double, int, string> action, string titleName = "", bool bSetHome = false, double mLatitude = 0.0, double mLongitude = 0.0, int mRadius = 500) { |
| | | |
| | | //GDConst.GetAppSHA1(Application.Activity); |
| | | |
| | | |
| | | if (bSetHome && (mLatitude != 0.0) && (mLongitude != 0.0)) |
| | | { |
| | | GDConst.BMyHomeSet = true; |
| | | GDConst.MyHomeLatitude = mLatitude; |
| | | GDConst.MyHomeLongitude = mLongitude; |
| | | GDConst.MyHomeRadiusRange = mRadius; |
| | | |
| | | } |
| | | else |
| | | { |
| | | GDConst.BMyHomeSet = false; |
| | | } |
| | | |
| | | GDConst.MyTitleName = titleName; |
| | | |
| | | GDGeoFenceRoundActivity.MOnGeofenceCallback = new OnGeofenceCallback(action); |
| | | |
| | | |
| | | Application.Activity.StartActivity(new Intent(Application.Activity, typeof(GDGeoFenceRoundActivity))); |
| | | } |
| | | |
| | | |
| | | /// <summary> |
| | | /// OnGeofenceCallback |
| | | /// </summary> |
| | | public class OnGeofenceCallback : Java.Lang.Object, IOnGeofenceCallback |
| | | { |
| | | |
| | | Action<double, double, int, string> mAction; |
| | | public OnGeofenceCallback(Action<double, double, int, string> action) |
| | | { |
| | | mAction = action; |
| | | } |
| | | |
| | | public void OnSaveCallback(double mLatitude, double mLongitude, float mRadius, string addressName) |
| | | { |
| | | mAction?.Invoke(mLatitude, mLongitude, (int)mRadius, addressName); |
| | | } |
| | | } |
| | | } |
| | | } |
New file |
| | |
| | | using System; |
| | | |
| | | //using static Com.Hdl.Widget.Gesturelock.GestureLockView; |
| | | |
| | | namespace Shared |
| | | { |
| | | |
| | | |
| | | |
| | | /// <summary> |
| | | /// GestureLockView |
| | | /// </summary> |
| | | public class GestureLockView : View |
| | | { |
| | | /// <summary> |
| | | /// å½åè§å¾ |
| | | /// </summary> |
| | | /// <value>The GestureLockView.</value> |
| | | Com.Hdl.Widget.Gesturelock.GestureLockView mHDLGestureLockView |
| | | { |
| | | get |
| | | { |
| | | return AndroidView as Com.Hdl.Widget.Gesturelock.GestureLockView; |
| | | } |
| | | set |
| | | { |
| | | AndroidView = value; |
| | | } |
| | | } |
| | | |
| | | /// <summary> |
| | | /// æé 彿° |
| | | /// </summary> |
| | | public GestureLockView() |
| | | { |
| | | mHDLGestureLockView = new Com.Hdl.Widget.Gesturelock.GestureLockView(Application.Activity); |
| | | //mHDLGestureLockView.ResetGesture(); |
| | | mOnLockVerifyListener = new OnLockVerifyListener(this); |
| | | |
| | | mHDLGestureLockView.SetOnLockVerifyListener(mOnLockVerifyListener); |
| | | |
| | | //mHDLGestureLockView.Measure |
| | | //mHDLGestureLockView. |
| | | } |
| | | |
| | | public void setinvalidate() |
| | | { |
| | | mHDLGestureLockView.Invalidate(); |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 设置æ£ç¡®åæ®éæ¶çé¢è² |
| | | /// </summary> |
| | | /// <value>线é¢è²</value> |
| | | public uint LockViewCorrectColor |
| | | { |
| | | set |
| | | { |
| | | |
| | | byte r, g, b, a; |
| | | r = (byte)(value / 256 / 256 % 256); |
| | | g = (byte)(value / 256 % 256); |
| | | b = (byte)(value % 256); |
| | | a = (byte)(value / 256 / 256 / 256 % 256); |
| | | |
| | | mHDLGestureLockView.SetMatchedPathColor(Android.Graphics.Color.Argb(a, r, g, b)); |
| | | mHDLGestureLockView.SetTouchedPathColor(Android.Graphics.Color.Argb(a, r, g, b)); |
| | | |
| | | } |
| | | } |
| | | |
| | | |
| | | |
| | | /// <summary> |
| | | /// 设置é误æ¶çé¢è² |
| | | /// </summary> |
| | | /// <value>线é¢è²</value> |
| | | public uint LockViewErrorColor |
| | | { |
| | | set |
| | | { |
| | | |
| | | byte r, g, b, a; |
| | | r = (byte)(value / 256 / 256 % 256); |
| | | g = (byte)(value / 256 % 256); |
| | | b = (byte)(value % 256); |
| | | a = (byte)(value / 256 / 256 / 256 % 256); |
| | | |
| | | mHDLGestureLockView.SetUnmatchedPathColor(Android.Graphics.Color.Argb(a, r, g, b)); |
| | | |
| | | |
| | | |
| | | } |
| | | } |
| | | |
| | | |
| | | /// <summary> |
| | | /// æ¾ç¤ºæå¿è§£éview æ¯å¦æ¾ç¤ºæ£ç¡® |
| | | /// </summary> |
| | | public void showCorrectStatus(bool isTrue) |
| | | { |
| | | if (isTrue) |
| | | { |
| | | mHDLGestureLockView.SetLockViewMatchedState(Java.Lang.Boolean.True); |
| | | } |
| | | else |
| | | { |
| | | mHDLGestureLockView.SetLockViewMatchedState(Java.Lang.Boolean.False); |
| | | } |
| | | } |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | /// <summary> |
| | | /// Action |
| | | /// </summary> |
| | | public Action<string, int> OnLockVerifyEvent; |
| | | |
| | | /// <summary> |
| | | /// OnProgressChangeListener ç»§æ¿ååºäºä»¶ |
| | | /// </summary> |
| | | OnLockVerifyListener mOnLockVerifyListener; |
| | | |
| | | public class OnLockVerifyListener : Java.Lang.Object, Com.Hdl.Widget.Gesturelock.GestureLockView.IOnLockVerifyListener |
| | | { |
| | | |
| | | GestureLockView _GestureLockView; |
| | | |
| | | public OnLockVerifyListener(GestureLockView view) |
| | | { |
| | | _GestureLockView = view; |
| | | } |
| | | |
| | | public void OnGestureFinished(string selectNumStr, int selectCount) |
| | | { |
| | | _GestureLockView.OnLockVerifyEvent?.Invoke(selectNumStr, selectCount); |
| | | } |
| | | |
| | | public void OnGestureSelected(int p0) |
| | | { |
| | | |
| | | } |
| | | |
| | | |
| | | } |
| | | |
| | | |
| | | |
| | | } |
| | | } |
New file |
| | |
| | | using System; |
| | | using Android.Views; |
| | | using Android.Content; |
| | | using Android.Widget; |
| | | using Android.Graphics.Drawables; |
| | | |
| | | |
| | | namespace Shared |
| | | { |
| | | //å·²ç»å
¨é¢æ£æ¥äºä»£ç |
| | | /// <summary> |
| | | /// ä½ç½®å¸å± |
| | | /// </summary> |
| | | public class HorizontalPages : ViewGroup |
| | | { |
| | | /// <summary> |
| | | /// è§å¾é«åº¦ |
| | | /// </summary> |
| | | /// <value>The height.</value> |
| | | public override int Height |
| | | { |
| | | get |
| | | { |
| | | return base.Height; |
| | | } |
| | | set |
| | | { |
| | | base.Height = value; |
| | | if (!IsCanRefresh) |
| | | { |
| | | return; |
| | | } |
| | | var layoutParameters = realViewGroup.LayoutParameters; |
| | | layoutParameters.Height = Height; |
| | | realViewGroup.LayoutParameters = layoutParameters; |
| | | } |
| | | } |
| | | |
| | | /// <summary> |
| | | /// è§å¾å®½åº¦ |
| | | /// </summary> |
| | | /// <value>The width.</value> |
| | | public override int Width |
| | | { |
| | | get |
| | | { |
| | | return base.Width; |
| | | } |
| | | set |
| | | { |
| | | base.Width = value; |
| | | if (!IsCanRefresh) |
| | | { |
| | | return; |
| | | } |
| | | var layoutParameters = realViewGroup.LayoutParameters; |
| | | layoutParameters.Width = Width; |
| | | realViewGroup.LayoutParameters = layoutParameters; |
| | | } |
| | | } |
| | | /// <summary> |
| | | /// 页é¢ååäºä»¶ |
| | | /// </summary> |
| | | public Action<HorizontalPages, int> PageChange; |
| | | /// <summary> |
| | | /// æé 彿° |
| | | /// </summary> |
| | | public HorizontalPages() |
| | | { |
| | | viewGroup = new AndroidFrameLayout(Application.Activity, null); |
| | | realViewGroup = new InnerHorizontalPages(Application.Activity, this) { }; |
| | | viewGroup.AddView(realViewGroup); |
| | | } |
| | | |
| | | int pageIndex; |
| | | /// <summary> |
| | | /// 设置æè
è·åå½åççé¢ç´¢å¼ |
| | | /// </summary> |
| | | /// <value>The index of the page.</value> |
| | | public int PageIndex |
| | | { |
| | | get |
| | | { |
| | | return (realViewGroup as InnerHorizontalPages).CurrentScreen; |
| | | } |
| | | set |
| | | { |
| | | if (value < 0 || ChildrenCount < value) |
| | | { |
| | | return; |
| | | } |
| | | pageIndex = value; |
| | | if (!IsCanRefresh) |
| | | { |
| | | return; |
| | | } |
| | | |
| | | (realViewGroup as InnerHorizontalPages).SetSelection(value); |
| | | } |
| | | } |
| | | |
| | | /// <summary> |
| | | /// æ¯å¦å
许æ»å¨ |
| | | /// </summary> |
| | | /// <value><c>true</c> if scroll enabled; otherwise, <c>false</c>.</value> |
| | | public bool ScrollEnabled |
| | | { |
| | | get |
| | | { |
| | | return (realViewGroup as InnerHorizontalPages).ScrollEnabled; |
| | | } |
| | | set |
| | | { |
| | | (realViewGroup as InnerHorizontalPages).ScrollEnabled = value; |
| | | } |
| | | } |
| | | |
| | | |
| | | |
| | | /// <summary> |
| | | /// å¢å åæ§ä»¶ |
| | | /// </summary> |
| | | /// <param name="view">View.</param> |
| | | public override void AddChidren(View view) |
| | | { |
| | | view.Parent = this; |
| | | viewList.Add(view); |
| | | realViewGroup.AddView(view.AndroidView); |
| | | |
| | | if (!IsCanRefresh) |
| | | { |
| | | return; |
| | | } |
| | | |
| | | view.Refresh(); |
| | | |
| | | if (view is ViewGroup) |
| | | { |
| | | var tempViewGroup = (ViewGroup)view; |
| | | for (int i = 0; i < tempViewGroup.ChildrenCount; i++) |
| | | { |
| | | tempViewGroup.GetChildren(i).Refresh(); |
| | | } |
| | | } |
| | | } |
| | | |
| | | /// <summary> |
| | | /// ç§»é¤å½åæ§ä»¶ |
| | | /// </summary> |
| | | /// <param name="view">View.</param> |
| | | internal override void Remove(View view) |
| | | { |
| | | if (view == null) |
| | | { |
| | | return; |
| | | } |
| | | var index = viewList.FindIndex(obj => obj == view); |
| | | if (index < 0) |
| | | { |
| | | return; |
| | | } |
| | | |
| | | viewList.Remove(view); |
| | | (realViewGroup as InnerHorizontalPages).RemoveViewAt(index); |
| | | view.Parent = null; |
| | | } |
| | | |
| | | /// <summary> |
| | | /// ç§»é¤ææçæ§ä»¶ |
| | | /// </summary> |
| | | public override void RemoveAll() |
| | | { |
| | | while (0 < viewList.Count) |
| | | { |
| | | GetChildren(0)?.RemoveFromParent(); |
| | | } |
| | | (realViewGroup as InnerHorizontalPages).SetSelection(0); |
| | | } |
| | | |
| | | /// <summary> |
| | | /// æ ¹æ®ç´¢å¼ç§»é¤æ§ä»¶ |
| | | /// </summary> |
| | | /// <param name="index">Index.</param> |
| | | public override void RemoveAt(int index) |
| | | { |
| | | if (viewList.Count - 1 < index || index < 0) |
| | | { |
| | | return; |
| | | } |
| | | GetChildren(index)?.RemoveFromParent(); |
| | | } |
| | | |
| | | |
| | | /// <summary> |
| | | /// pageçå¤è¾¹è· |
| | | /// </summary> |
| | | public int RowPadding |
| | | { |
| | | get |
| | | { |
| | | return (realViewGroup as InnerHorizontalPages).Padding; |
| | | } |
| | | set |
| | | { |
| | | (realViewGroup as InnerHorizontalPages).Padding = value; |
| | | |
| | | } |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 两个Pageä¹é´çè·ç¦» |
| | | /// </summary> |
| | | public int PagePadding |
| | | { |
| | | get |
| | | { |
| | | return (realViewGroup as InnerHorizontalPages).Padding - (realViewGroup as InnerHorizontalPages).PagePadding; |
| | | } |
| | | set |
| | | { |
| | | (realViewGroup as InnerHorizontalPages).PagePadding = (realViewGroup as InnerHorizontalPages).Padding - value; |
| | | |
| | | } |
| | | } |
| | | } |
| | | |
| | | public class InnerHorizontalPages : Android.Widget.FrameLayout |
| | | { |
| | | public bool ScrollEnabled = true; |
| | | static int snapVelocity = 1000; |
| | | static int invalidScreen = -1; |
| | | static int touchStateRest = 0; |
| | | static int touchStateScrolling = 1; |
| | | |
| | | /// <summary> |
| | | /// çé¢ä¹é´çè¾¹è· |
| | | /// </summary> |
| | | public int Padding = 100; |
| | | public int PagePadding = 50; |
| | | Scroller scroller; |
| | | VelocityTracker mVelocityTracker = VelocityTracker.Obtain(); |
| | | int touchState = touchStateRest; |
| | | float lastMotionX; |
| | | float lastMotionY; |
| | | int mTouchSlop; |
| | | int mMaximumVelocity; |
| | | internal int CurrentScreen; |
| | | |
| | | public override void RemoveViewAt(int index) |
| | | { |
| | | if (index == ChildCount - 1) { |
| | | CurrentScreen--; |
| | | if (CurrentScreen < 0) { |
| | | CurrentScreen = 0; |
| | | } |
| | | } |
| | | base.RemoveViewAt(index); |
| | | |
| | | //å·æ° |
| | | snapToDestination(); |
| | | } |
| | | |
| | | Shared.HorizontalPages horizontalPages; |
| | | public InnerHorizontalPages(Context context, Shared.HorizontalPages view) : base(context) |
| | | { |
| | | horizontalPages = view; |
| | | init(); |
| | | } |
| | | |
| | | /// <summary> |
| | | /// éåè¿ä¸ªæ¯ä¸ºäºæ¹ä¾¿é¨å±ï¼å¨æ¯ä¸ªçé¢ä¹é´é½å¤å äºä¸ä¸ªæ§ä»¶å
ä½ |
| | | /// </summary> |
| | | /// <param name="child"></param> |
| | | public override void AddView(Android.Views.View child) |
| | | { |
| | | var innerView = new Android.Widget.FrameLayout(Shared.Application.Activity); |
| | | innerView.SetPadding(Padding, 0, Padding, 0); |
| | | if (1 <= ChildCount) |
| | | { |
| | | innerView.SetX(LayoutParameters.Width * ChildCount - Padding - PagePadding); |
| | | } |
| | | base.AddView(innerView, new Android.Widget.FrameLayout.LayoutParams(LayoutParameters.Width, LayoutParameters.Height) { }); |
| | | innerView.AddView(child); |
| | | } |
| | | |
| | | void init() |
| | | { |
| | | scroller = new Scroller(Context); |
| | | var configuration = ViewConfiguration.Get(Context); |
| | | //æå°çæ»å¨è·ç¦» |
| | | mTouchSlop = configuration.ScaledTouchSlop; |
| | | mMaximumVelocity = configuration.ScaledMaximumFlingVelocity; |
| | | } |
| | | |
| | | public override void RequestDisallowInterceptTouchEvent(bool disallowIntercept) |
| | | { |
| | | base.RequestDisallowInterceptTouchEvent(disallowIntercept); |
| | | disallowInterceptTouchEvent = disallowIntercept; |
| | | } |
| | | bool disallowInterceptTouchEvent; |
| | | |
| | | bool isFirst; |
| | | public override bool OnInterceptTouchEvent(MotionEvent ev) |
| | | { |
| | | if (disallowInterceptTouchEvent) |
| | | { |
| | | return false; |
| | | } |
| | | System.Console.WriteLine($"PageLayout->OnInterceptTouchEvent:{Height} {ev.Action}"); |
| | | //å¦ææ²¡æåæ§ä»¶æè
ä¸å
许æ»å¨å°±è¿åï¼ä¸å¤çå½åäºä»¶ |
| | | if (ChildCount == 0 || !ScrollEnabled) |
| | | return false; |
| | | |
| | | mVelocityTracker.AddMovement(ev); |
| | | var x = ev.GetX(); |
| | | var y = ev.GetY(); |
| | | switch (ev.Action) |
| | | { |
| | | //æ¯æ¬¡ç¹å»é½æ§è¡è¿é |
| | | case MotionEventActions.Down: |
| | | if (!scroller.IsFinished) |
| | | { |
| | | //妿è¿å¨æ»å¨ï¼ä½æ¯ç¨æ·éæ°ç¹å»äºï¼å°±è®©æ§ä»¶é©¬ä¸åæ¢ |
| | | scroller.AbortAnimation(); |
| | | snapToDestination(false); |
| | | } |
| | | //è®°å½ç¹å»çææ°Xåæ |
| | | lastMotionX = x; |
| | | lastMotionY = y; |
| | | touchState = scroller.IsFinished ? touchStateRest : touchStateScrolling; |
| | | break; |
| | | //æåæ§ä»¶æ¶æ§è¡è¿é |
| | | case MotionEventActions.Move: |
| | | var deltaX = (int)(lastMotionX - x); |
| | | var deltaY = (int)(lastMotionY - y); |
| | | //å½åæ»å¨æ¯å¦å·²ç»è¶
åºäºè®¾å®å¼ |
| | | var xMoved = Math.Abs(deltaX) > mTouchSlop; |
| | | System.Console.WriteLine($"PageLayout->xMoved22:{xMoved } {deltaX}"); |
| | | |
| | | if (xMoved && Math.Abs(deltaY) < Math.Abs(deltaX)) |
| | | { |
| | | if (!isFirst) |
| | | { |
| | | touchState = touchStateScrolling; |
| | | } |
| | | isFirst = false; |
| | | System.Console.WriteLine($"PageLayout->xMoved33:{xMoved } {deltaX}"); |
| | | |
| | | } |
| | | if (touchState == touchStateScrolling) |
| | | { |
| | | //è®°å½ææ°çåæ ï¼å 为æ¥ä¸æ¥æ§ä»¶å·²ç»æ»å¨äº |
| | | lastMotionX = x; |
| | | System.Console.WriteLine($"PageLayout->lastMotionX:{lastMotionX } {touchState}"); |
| | | //å½åäºä»¶èªå·±å¤çäºï¼åæ§å¶ä¸éè¦å¤çå½åè¿äºä»¶ |
| | | return true; |
| | | } |
| | | break; |
| | | case MotionEventActions.Cancel: |
| | | touchState = touchStateRest; |
| | | mVelocityTracker.Clear(); |
| | | break; |
| | | } |
| | | return false; |
| | | } |
| | | |
| | | public override bool OnTouchEvent(MotionEvent e) |
| | | { |
| | | if (disallowInterceptTouchEvent) |
| | | { |
| | | return false; |
| | | } |
| | | System.Console.WriteLine($"PageLayout->OnTouchEvent:{Height} {e.Action}"); |
| | | |
| | | if (ChildCount == 0 || !ScrollEnabled) |
| | | return false; |
| | | |
| | | mVelocityTracker.AddMovement(e); |
| | | |
| | | var x = e.GetX(); |
| | | var y = e.GetY(); |
| | | switch (e.Action) |
| | | { |
| | | case MotionEventActions.Move: |
| | | var deltaX = (int)(lastMotionX - x); |
| | | var deltaY = (int)(lastMotionY - y); |
| | | //å½åæ»å¨æ¯å¦å·²ç»è¶
åºäºè®¾å®å¼ |
| | | var xMoved = Math.Abs(deltaX) > mTouchSlop; |
| | | |
| | | System.Console.WriteLine($"PageLayout->xMoved:{xMoved } {deltaX}"); |
| | | |
| | | if (xMoved && Math.Abs(deltaY) < Math.Abs(deltaX)) |
| | | { |
| | | if (!isFirst) |
| | | { |
| | | touchState = touchStateScrolling; |
| | | } |
| | | isFirst = false; |
| | | } |
| | | |
| | | if (touchState == touchStateScrolling) |
| | | { |
| | | lastMotionX = x; |
| | | return true; |
| | | } |
| | | break; |
| | | |
| | | case MotionEventActions.Up: |
| | | if (touchState == touchStateScrolling) |
| | | { |
| | | mVelocityTracker.ComputeCurrentVelocity(1000, mMaximumVelocity); |
| | | var velocityX = mVelocityTracker.XVelocity; |
| | | |
| | | if (velocityX > snapVelocity && CurrentScreen > 0) |
| | | { |
| | | // æ¾ç¤ºå·¦è¾¹çé¢ |
| | | snapToScreen(CurrentScreen - 1); |
| | | } |
| | | else if (velocityX < -snapVelocity && CurrentScreen < ChildCount - 1) |
| | | { |
| | | // æ¾ç¤ºå³è¾¹çé¢ |
| | | snapToScreen(CurrentScreen + 1); |
| | | } |
| | | } |
| | | |
| | | touchState = touchStateRest; |
| | | mVelocityTracker.Clear(); |
| | | break; |
| | | case MotionEventActions.Cancel: |
| | | touchState = touchStateRest; |
| | | mVelocityTracker.Clear(); |
| | | break; |
| | | } |
| | | return true; |
| | | } |
| | | |
| | | /// <summary> |
| | | /// æ»å¨å°æå®ççé¢ |
| | | /// </summary> |
| | | void snapToDestination(bool isDelay = true) |
| | | { |
| | | var whichScreen = (ScrollX + (MeasuredWidth / 2)) / MeasuredWidth; |
| | | |
| | | snapToScreen(whichScreen, isDelay); |
| | | } |
| | | /// <summary> |
| | | /// æ»å¨å°æå®çé¢ |
| | | /// </summary> |
| | | /// <param name="whichScreen">Which screen.</param> |
| | | void snapToScreen(int whichScreen, bool isDelay = true) |
| | | { |
| | | if (!scroller.IsFinished) |
| | | { |
| | | scroller.AbortAnimation(); |
| | | } |
| | | var beforePosition = CurrentScreen; |
| | | whichScreen = Math.Max(0, Math.Min(whichScreen, ChildCount - 1)); |
| | | CurrentScreen = whichScreen; |
| | | //è¿åè¿ä¸ªæ§ä»¶ä¹åçä½ç½® |
| | | var newX = CurrentScreen * MeasuredWidth; |
| | | var delta = newX - ScrollX; |
| | | scroller.StartScroll(ScrollX, 0, delta, 0, isDelay ? 800 : 0); |
| | | Invalidate(); |
| | | refreshPage(); |
| | | |
| | | if (beforePosition != CurrentScreen) |
| | | { |
| | | horizontalPages.PageChange?.Invoke(horizontalPages, CurrentScreen); |
| | | } |
| | | } |
| | | |
| | | void refreshPage() |
| | | { |
| | | GetChildAt(CurrentScreen).SetX(LayoutParameters.Width * CurrentScreen); |
| | | |
| | | if (0 <= CurrentScreen - 1) |
| | | { |
| | | //让ä¸ä¸ä¸ªçé¢åå³åºæ¥ä¸ç¹ |
| | | GetChildAt(CurrentScreen - 1).SetX(LayoutParameters.Width * (CurrentScreen - 1) + Padding + PagePadding); |
| | | } |
| | | if (CurrentScreen + 1 <= ChildCount - 1) |
| | | { |
| | | //让ä¸ä¸ä¸ªçé¢åå·¦åºæ¥ä¸ç¹ |
| | | GetChildAt(CurrentScreen + 1).SetX(LayoutParameters.Width * (CurrentScreen + 1) - Padding - PagePadding); |
| | | } |
| | | } |
| | | public override void ComputeScroll() |
| | | { |
| | | if (scroller.ComputeScrollOffset()) |
| | | { |
| | | ScrollTo(scroller.CurrX, scroller.CurrY); |
| | | PostInvalidate(); |
| | | } |
| | | else if (CurrentScreen != invalidScreen) |
| | | { |
| | | //mCurrentScreen = Math.Max(0, Math.Min(mNextScreen, ChildCount - 1)); |
| | | //mNextScreen = invalidScreen; |
| | | //postViewSwitched(mLastScrollDirection); |
| | | } |
| | | } |
| | | |
| | | public void SetSelection(int position) |
| | | { |
| | | if (position < 0) |
| | | { |
| | | return; |
| | | } |
| | | scroller.ForceFinished(true); |
| | | |
| | | position = Math.Min(position, ChildCount - 1); |
| | | |
| | | snapToScreen(position, false); |
| | | } |
| | | |
| | | public override bool DispatchTouchEvent(MotionEvent e) |
| | | { |
| | | //System.Console.WriteLine($"PageLayout->DispatchTouchEvent:{Height} {e.Action}"); |
| | | if (e.Action == MotionEventActions.Down) |
| | | { |
| | | //è¿å䏿 |
| | | RequestDisallowInterceptTouchEvent(false); |
| | | isFirst = true; |
| | | } |
| | | return base.DispatchTouchEvent(e); |
| | | } |
| | | } |
| | | } |
| | | |
| | | |
| | | |
New file |
| | |
| | | using System; |
| | | using Android.Widget; |
| | | using Android.Views; |
| | | using Android.Content; |
| | | using Android.Util; |
| | | using Android.Runtime; |
| | | |
| | | namespace Shared |
| | | { |
| | | //å·²ç»å
¨é¢æ£æ¥äºä»£ç |
| | | /// <summary> |
| | | /// ä½ç½®å¸å± |
| | | /// </summary> |
| | | public class HorizontalScrolViewLayout:ViewGroup |
| | | { |
| | | /// <summary> |
| | | /// æé 彿° |
| | | /// </summary> |
| | | public HorizontalScrolViewLayout() |
| | | { |
| | | viewGroup = new AndroidHorizontalScrollView(Application.Activity,this); |
| | | realViewGroup = new AndroidLinearLayout(Application.Activity,this); |
| | | (realViewGroup as AndroidLinearLayout).Orientation = Orientation.Horizontal; |
| | | viewGroup.AddView(realViewGroup); |
| | | } |
| | | |
| | | /// <summary> |
| | | /// è§å¾å®½åº¦ |
| | | /// </summary> |
| | | /// <value>The width.</value> |
| | | public override int Width |
| | | { |
| | | get |
| | | { |
| | | return base.Width; |
| | | } |
| | | set |
| | | { |
| | | base.Width = value; |
| | | if (!IsCanRefresh) |
| | | { |
| | | return; |
| | | } |
| | | realViewGroup.LayoutParameters.Width = Width; |
| | | |
| | | } |
| | | } |
| | | |
| | | /// <summary> |
| | | /// è§å¾é«åº¦ |
| | | /// </summary> |
| | | /// <value>The height.</value> |
| | | public override int Height |
| | | { |
| | | get |
| | | { |
| | | return base.Height; |
| | | } |
| | | set |
| | | { |
| | | base.Height = value; |
| | | if (!IsCanRefresh) |
| | | { |
| | | return; |
| | | } |
| | | realViewGroup.LayoutParameters.Height = Height; |
| | | } |
| | | } |
| | | |
| | | /// <summary> |
| | | /// æ¯å¦å
许æ»å¨ |
| | | /// </summary> |
| | | /// <value><c>true</c> if scroll enabled; otherwise, <c>false</c>.</value> |
| | | public bool ScrollEnabled |
| | | { |
| | | get |
| | | { |
| | | return (viewGroup as AndroidHorizontalScrollView).ScrollEnabled; |
| | | } |
| | | set |
| | | { |
| | | |
| | | (viewGroup as AndroidHorizontalScrollView).ScrollEnabled = value; |
| | | |
| | | } |
| | | } |
| | | |
| | | /// <summary> |
| | | /// æ¯å¦æ£å¨æ»å¨ |
| | | /// </summary> |
| | | /// <value><c>true</c> if decelerating; otherwise, <c>false</c>.</value> |
| | | public bool Decelerating |
| | | { |
| | | get |
| | | { |
| | | return false; |
| | | } |
| | | } |
| | | } |
| | | |
| | | /// <summary> |
| | | /// Android åç AndroidHorizontalScrollView |
| | | /// </summary> |
| | | class AndroidHorizontalScrollView: Android.Widget.HorizontalScrollView |
| | | { |
| | | public bool ScrollEnabled=true; |
| | | View _view; |
| | | /// <summary> |
| | | /// æé 彿° |
| | | /// </summary> |
| | | /// <param name="context">Context.</param> |
| | | /// <param name="view">View.</param> |
| | | public AndroidHorizontalScrollView(Context context,View view) |
| | | : base(context) { |
| | | _view = view; |
| | | } |
| | | |
| | | |
| | | |
| | | /// <summary> |
| | | /// éåç¹å»äºä»¶ |
| | | /// </summary> |
| | | /// <returns><c>true</c>äºä»¶å·²ç»å¤ç<c>false</c>äºä»¶æ²¡æå¤ç</returns> |
| | | /// <param name="e">E.</param> |
| | | public override bool OnTouchEvent(MotionEvent e) |
| | | { |
| | | if (ScrollEnabled) |
| | | { |
| | | base.OnTouchEvent(e); |
| | | } |
| | | _view.TouchEvent( e); |
| | | return true; |
| | | } |
| | | |
| | | public override bool DispatchTouchEvent(MotionEvent e) |
| | | { |
| | | System.Console.WriteLine($"{GetType()} Height->{Height} Width->{Width} DispatchTouchEvent->{e.Action}"); |
| | | if (e.Action == MotionEventActions.Down) |
| | | { |
| | | //è¿åå
è®¸æ¦æªäºä»¶ |
| | | RequestDisallowInterceptTouchEvent(false); |
| | | } |
| | | return base.DispatchTouchEvent(e); |
| | | } |
| | | |
| | | float mLastX, mLastY; |
| | | public override bool OnInterceptTouchEvent(MotionEvent ev) |
| | | { |
| | | System.Console.WriteLine($"{GetType()} Height->{Height} Width->{Width} OnInterceptTouchEvent->{ev.Action}"); |
| | | |
| | | if (!Enabled || disallowIntercept) |
| | | { |
| | | return false; |
| | | } |
| | | |
| | | switch (ev.Action) |
| | | { |
| | | case MotionEventActions.Down: |
| | | mLastX = ev.RawX; |
| | | mLastY = ev.RawY; |
| | | Parent?.RequestDisallowInterceptTouchEvent(true); |
| | | break; |
| | | case MotionEventActions.Move: |
| | | var x = ev.RawX; |
| | | var y = ev.RawY; |
| | | var deltaX = x - mLastX; |
| | | var deltaY = y - mLastY; |
| | | |
| | | //左峿»å¨ |
| | | if (Math.Abs(deltaY) < Math.Abs(deltaX)) |
| | | { |
| | | //å䏿»å¨ï¼å¦æå½åå·²ç»æ»å¨å°é¡¶ï¼å°±å
è®¸ç¶æ§ä»¶çæ¦æªäºä»¶ |
| | | if (deltaX > 0 && ScrollX == 0) |
| | | { |
| | | Parent?.RequestDisallowInterceptTouchEvent(false); |
| | | return false; |
| | | } |
| | | //å䏿»å¨æ¶ï¼å¦ætranslateYçäºé«åº¦æ¶ï¼å³è¡¨ææ»å¨å°åºé¨ï¼å¯åé¡¶å±Viewæ§å¶æ»å¨ |
| | | var rightLoaction = 0; |
| | | if (0 < ChildCount) |
| | | { |
| | | rightLoaction = GetChildAt(ChildCount - 1).Right; |
| | | } |
| | | var translateX = rightLoaction - ScrollX; |
| | | if (deltaX < 0 && translateX == Width) |
| | | { |
| | | Parent?.RequestDisallowInterceptTouchEvent(false); |
| | | return false; |
| | | } |
| | | } |
| | | else |
| | | { |
| | | //ä¸ä¸æ»å¨æ¶ï¼å
è®¸ç¶æ§ä»¶çæ¦æª |
| | | if (4 < Math.Abs(deltaY)) |
| | | { |
| | | Parent?.RequestDisallowInterceptTouchEvent(false); |
| | | } |
| | | } |
| | | break; |
| | | } |
| | | |
| | | return base.OnInterceptTouchEvent(ev); |
| | | } |
| | | bool disallowIntercept; |
| | | public override void RequestDisallowInterceptTouchEvent(bool disallowIntercept) |
| | | { |
| | | this.disallowIntercept = disallowIntercept; |
| | | System.Console.WriteLine($"{GetType()} Height->{Height} RequestDisallowInterceptTouchEvent->{disallowIntercept}"); |
| | | base.RequestDisallowInterceptTouchEvent(disallowIntercept); |
| | | Parent?.RequestDisallowInterceptTouchEvent(disallowIntercept); |
| | | } |
| | | } |
| | | |
| | | } |
New file |
| | |
| | | using System; |
| | | using Android.Views; |
| | | using Android.Content; |
| | | using Android.Util; |
| | | using Android.Runtime; |
| | | |
| | | namespace Shared |
| | | { |
| | | //å·²ç»å
¨é¢æ£æ¥äºä»£ç |
| | | /// <summary> |
| | | /// ä½ç½®å¸å± |
| | | /// </summary> |
| | | public class HorizontalSeekBar : View |
| | | { |
| | | Android.Widget.ImageView backImageView; |
| | | Android.Widget.ImageView progressImageView; |
| | | Android.Widget.Button thumbButton; |
| | | AndroidHorizontalSeekBar androidHorizonetalSeekBar; |
| | | /// <summary> |
| | | /// å½åå®ä¾ |
| | | /// </summary> |
| | | public HorizontalSeekBar() |
| | | { |
| | | AndroidView = new AndroidFrameLayout(Application.Activity, null) { }; |
| | | //AndroidView.SetBackgroundColor (Android.Graphics.Color.DarkCyan); |
| | | { |
| | | backImageView = new Android.Widget.ImageView(Application.Activity, null) { Enabled=false }; |
| | | backImageView.SetBackgroundColor(Android.Graphics.Color.WhiteSmoke); |
| | | (AndroidView as AndroidFrameLayout).AddView(backImageView, new Android.Widget.FrameLayout.LayoutParams(Android.Views.ViewGroup.LayoutParams.MatchParent, Dip2Px(2), GravityFlags.CenterVertical)); |
| | | } |
| | | |
| | | progressImageView = new Android.Widget.ImageView(Application.Activity, null) { Enabled=false}; |
| | | progressImageView.SetBackgroundColor(Android.Graphics.Color.Rgb(0xFE, 0x5E, 00)); |
| | | (AndroidView as AndroidFrameLayout).AddView(progressImageView, new Android.Widget.FrameLayout.LayoutParams(0, Dip2Px(2), GravityFlags.CenterVertical)); |
| | | |
| | | thumbButton = new Android.Widget.Button(Application.Activity, null) { Background = new Android.Graphics.Drawables.GradientDrawable(),Enabled=false }; |
| | | (AndroidView as AndroidFrameLayout).AddView(thumbButton, new Android.Widget.FrameLayout.LayoutParams(Dip2Px(ThumbRadius), Dip2Px(ThumbRadius), GravityFlags.CenterVertical)); |
| | | |
| | | androidHorizonetalSeekBar = new AndroidHorizontalSeekBar(Application.Activity, this); |
| | | (AndroidView as AndroidFrameLayout).AddView(androidHorizonetalSeekBar, new Android.Widget.FrameLayout.LayoutParams(Android.Views.ViewGroup.LayoutParams.MatchParent, Android.Views.ViewGroup.LayoutParams.MatchParent)); |
| | | |
| | | } |
| | | |
| | | uint progressColor = 0xFFEB642C; |
| | | /// <summary> |
| | | /// è¿åº¦é¢è² |
| | | /// </summary> |
| | | /// <value>The color of the progress.</value> |
| | | public uint ProgressColor |
| | | { |
| | | get |
| | | { |
| | | return progressColor; |
| | | } |
| | | set |
| | | { |
| | | progressColor = value; |
| | | int r = (byte)(progressColor / 256 / 256 % 256); |
| | | int g = (byte)(progressColor / 256 % 256); |
| | | int b = (byte)(progressColor % 256); |
| | | int a = (byte)(progressColor / 256 / 256 / 256 % 256); |
| | | progressImageView.SetBackgroundColor(Android.Graphics.Color.Argb(a, r, g, b)); |
| | | } |
| | | } |
| | | |
| | | public int SleepTime = 0; |
| | | |
| | | |
| | | uint backgroundColor = (uint)Android.Graphics.Color.WhiteSmoke.ToArgb(); |
| | | /// <summary> |
| | | /// åºé¨é¢è² |
| | | /// </summary> |
| | | /// <value>The color of the background.</value> |
| | | public new uint BackgroundColor |
| | | { |
| | | get |
| | | { |
| | | return backgroundColor; |
| | | } |
| | | set |
| | | { |
| | | backgroundColor = value; |
| | | int r = (byte)(backgroundColor / 256 / 256 % 256); |
| | | int g = (byte)(backgroundColor / 256 % 256); |
| | | int b = (byte)(backgroundColor % 256); |
| | | int a = (byte)(backgroundColor / 256 / 256 / 256 % 256); |
| | | backImageView.SetBackgroundColor(Android.Graphics.Color.Argb(a, r, g, b)); |
| | | } |
| | | } |
| | | |
| | | /// <summary> |
| | | /// è¿åº¦ååäºä»¶ |
| | | /// </summary> |
| | | public Action<View, int> ProgressChanged; |
| | | |
| | | /// <summary> |
| | | /// æå¤§å¼ |
| | | /// </summary> |
| | | /// <value>The max.</value> |
| | | public int Max |
| | | { |
| | | get |
| | | { |
| | | return androidHorizonetalSeekBar.Max; |
| | | } |
| | | set |
| | | { |
| | | androidHorizonetalSeekBar.Max = value; |
| | | } |
| | | } |
| | | /// <summary> |
| | | /// æ¯å¦å
许æ»å¨æ»å |
| | | /// </summary> |
| | | /// <value><c>true</c> if is can scrolled; otherwise, <c>false</c>.</value> |
| | | public bool IsCanScrolled |
| | | { |
| | | get |
| | | { |
| | | return androidHorizonetalSeekBar.Enabled; |
| | | } |
| | | set |
| | | { |
| | | thumbButton.Visibility = value ? ViewStates.Visible : ViewStates.Gone; |
| | | androidHorizonetalSeekBar.Enabled = value; |
| | | } |
| | | } |
| | | |
| | | //2019-08-29 æ¹100æ¯«ç§ |
| | | public int DelayTime = 100; |
| | | //鲿¢è·³å¨ï¼å»¶æ¶æ¾ç¤ºç¶æ |
| | | public DateTime delayDateTime = DateTime.MinValue; |
| | | /// <summary> |
| | | /// å½åè¿åº¦ |
| | | /// </summary> |
| | | /// <value>The progress.</value> |
| | | public int Progress |
| | | { |
| | | get |
| | | { |
| | | return androidHorizonetalSeekBar.Progress; |
| | | } |
| | | set |
| | | { |
| | | //åéå½ä»¤å1000毫ç§å
䏿´æ°ç¶æï¼é²æ¢è·³å¨ |
| | | if ((DateTime.Now - delayDateTime).TotalMilliseconds < DelayTime) |
| | | { |
| | | return; |
| | | } |
| | | androidHorizonetalSeekBar.Progress = value; |
| | | if (!IsCanRefresh) |
| | | { |
| | | return; |
| | | } |
| | | |
| | | int width = (int)(androidHorizonetalSeekBar.Progress * 1.0 / androidHorizonetalSeekBar.Max * (Width - thumbButton.LayoutParameters.Width)); |
| | | progressImageView.LayoutParameters.Width = width + thumbButton.LayoutParameters.Width / 2; |
| | | var layoutParameter = (thumbButton.LayoutParameters as Android.Widget.FrameLayout.LayoutParams); |
| | | layoutParameter.LeftMargin = width; |
| | | thumbButton.LayoutParameters = layoutParameter; |
| | | } |
| | | } |
| | | |
| | | uint thumbColor = 0xFFFFFFFF; |
| | | /// <summary> |
| | | /// æ»åé¢è² |
| | | /// </summary> |
| | | /// <value>The color of the background.</value> |
| | | public uint ThumbColor |
| | | { |
| | | get |
| | | { |
| | | return thumbColor; |
| | | } |
| | | set |
| | | { |
| | | thumbColor = value; |
| | | int r = (byte)(thumbColor / 256 / 256 % 256); |
| | | int g = (byte)(thumbColor / 256 % 256); |
| | | int b = (byte)(thumbColor % 256); |
| | | int a = (byte)(thumbColor / 256 / 256 / 256 % 256); |
| | | |
| | | ((Android.Graphics.Drawables.GradientDrawable)thumbButton.Background).SetColor(Android.Graphics.Color.Argb(a, r, g, b)); |
| | | } |
| | | } |
| | | |
| | | public DateTime dateTime = DateTime.MinValue; |
| | | internal override bool TouchEvent(MotionEvent e) |
| | | { |
| | | if (!IsCanMove||!Enable) |
| | | { |
| | | return true; |
| | | } |
| | | delayDateTime = DateTime.Now; |
| | | switch (e.Action) |
| | | { |
| | | case MotionEventActions.Down: |
| | | dateTime = DateTime.MinValue; |
| | | break; |
| | | case MotionEventActions.Move: |
| | | if (dateTime == DateTime.MinValue) |
| | | { |
| | | dateTime = DateTime.Now; |
| | | } |
| | | setValue(e.GetX()); |
| | | break; |
| | | case MotionEventActions.Up: |
| | | dateTime = DateTime.MinValue; |
| | | setValue(e.GetX()); |
| | | |
| | | break; |
| | | } |
| | | return base.TouchEvent(e); |
| | | } |
| | | |
| | | int beforValue; |
| | | /// <summary> |
| | | /// æ¯å¦å¯ä»¥æ»å¨ |
| | | /// </summary> |
| | | public bool IsCanMove = true; |
| | | void setValue(float x) |
| | | { |
| | | |
| | | if (x < 0) |
| | | { |
| | | x = 0; |
| | | } |
| | | if (Width - thumbButton.LayoutParameters.Width < x) |
| | | { |
| | | x = Width - thumbButton.LayoutParameters.Width; |
| | | } |
| | | var tempValue = androidHorizonetalSeekBar.Progress; |
| | | |
| | | androidHorizonetalSeekBar.Progress = (int)(x / (Width - thumbButton.LayoutParameters.Width) * Max); |
| | | |
| | | |
| | | int width = (int)(androidHorizonetalSeekBar.Progress * 1.0 / androidHorizonetalSeekBar.Max * (Width - thumbButton.LayoutParameters.Width)); |
| | | progressImageView.LayoutParameters.Width = width + thumbButton.LayoutParameters.Width / 2; |
| | | var layoutParameter = thumbButton.LayoutParameters as Android.Widget.FrameLayout.LayoutParams; |
| | | layoutParameter.LeftMargin = width; |
| | | thumbButton.LayoutParameters = layoutParameter; |
| | | |
| | | if (tempValue != androidHorizonetalSeekBar.Progress || tempValue == 0 || tempValue == Max|| dateTime== DateTime.MinValue) |
| | | { |
| | | //ç¹å»ä¸æè
弹起æè
æ»å¨æ¶é´500毫ç§çæ¶åï¼å°±è§¦åäºä»¶ |
| | | if (ProgressChanged != null |
| | | && SleepTime < (DateTime.Now - dateTime).TotalMilliseconds) |
| | | { |
| | | dateTime = DateTime.MinValue; |
| | | delayDateTime = DateTime.Now; |
| | | ProgressChanged(this, androidHorizonetalSeekBar.Progress); |
| | | } |
| | | } |
| | | } |
| | | |
| | | int thumbRadius = 10; |
| | | public int ThumbRadius |
| | | { |
| | | get |
| | | { |
| | | return thumbRadius; |
| | | } |
| | | set |
| | | { |
| | | thumbRadius = value; |
| | | if (!IsCanRefresh) |
| | | { |
| | | return; |
| | | } |
| | | |
| | | thumbButton.LayoutParameters.Width = Dip2Px(ThumbRadius) * 2; |
| | | thumbButton.LayoutParameters.Height = Dip2Px(ThumbRadius) * 2; |
| | | var gradientDrawable = thumbButton.Background as Android.Graphics.Drawables.GradientDrawable; |
| | | gradientDrawable.SetCornerRadius(Dip2Px(ThumbRadius)); |
| | | gradientDrawable.SetSize(Dip2Px(ThumbRadius) * 2, Dip2Px(ThumbRadius) * 2); |
| | | thumbButton.Background = gradientDrawable; |
| | | ThumbColor = thumbColor; |
| | | } |
| | | } |
| | | |
| | | public override void Refresh() |
| | | { |
| | | base.Refresh(); |
| | | ThumbRadius = thumbRadius; |
| | | ProgressColor = progressColor; |
| | | Progress = androidHorizonetalSeekBar.Progress; |
| | | } |
| | | |
| | | /// <summary> |
| | | /// éè¦éåçè§å¾ |
| | | /// </summary> |
| | | class AndroidHorizontalSeekBar : Android.Widget.SeekBar |
| | | { |
| | | View view; |
| | | public AndroidHorizontalSeekBar(Context context, View view) |
| | | : base(context) |
| | | { |
| | | this.view = view; |
| | | ProgressDrawable = null; |
| | | SetThumb(null); |
| | | } |
| | | /// <summary> |
| | | /// å¦æå·²ç»æ¯æ¨ªåæ»å¨ï¼ç¶æ§ä»¶ä¸å
许å请æ±ä¸æ |
| | | /// </summary> |
| | | bool isHorizontalActioned; |
| | | /// <summary> |
| | | /// è®°å½æåç¹å»çXè½´åæ |
| | | /// </summary> |
| | | float mLastMotionX; |
| | | /// <summary> |
| | | /// ç¹å»Yè½´çåæ |
| | | /// </summary> |
| | | float mLastMotionY; |
| | | public override bool OnTouchEvent(MotionEvent e) |
| | | { |
| | | switch (e.Action) |
| | | { |
| | | case MotionEventActions.Down: |
| | | isHorizontalActioned = false; |
| | | //è¿æ¥çæ¶åç¦æ¢ç¶æ§å¶ææ |
| | | Parent?.RequestDisallowInterceptTouchEvent(true); |
| | | //è®°å½ç¹å»çXåæ |
| | | mLastMotionX = e.RawX; |
| | | mLastMotionY = e.RawY; |
| | | break; |
| | | case MotionEventActions.Move: |
| | | var deltaX = mLastMotionX - e.RawX; |
| | | var deltaY = mLastMotionY - e.RawY; |
| | | //å¦æä¸»è¦æ»å¨çæ¯Yè½´æ¯è¾å¤§ï¼è¿å |
| | | if (Math.Abs(deltaX) < Math.Abs(deltaY)) |
| | | { |
| | | if (ViewConfiguration.Get(Context).ScaledTouchSlop < Math.Abs(deltaY) && !isHorizontalActioned) |
| | | { |
| | | Parent?.RequestDisallowInterceptTouchEvent(false); |
| | | } |
| | | return true; |
| | | } |
| | | //妿ä¸å¨æ»å¨èå´å
ï¼ä¸æ§è¡æ»å¨ |
| | | if (Math.Abs(deltaX) < ViewConfiguration.Get(Context).ScaledTouchSlop) |
| | | { |
| | | return true; |
| | | } |
| | | isHorizontalActioned = true; |
| | | view?.TouchEvent(e); |
| | | break; |
| | | case MotionEventActions.Up: |
| | | view?.TouchEvent(e); |
| | | break; |
| | | } |
| | | |
| | | return true; |
| | | } |
| | | } |
| | | } |
| | | } |
New file |
| | |
| | | using System; |
| | | using Android.Content; |
| | | using Android.Graphics; |
| | | using Android.Graphics.Drawables; |
| | | using Android.OS; |
| | | using Android.Util; |
| | | using Android.Views; |
| | | |
| | | namespace Shared |
| | | { |
| | | //å·²ç»å
¨é¢æ£æ¥äºä»£ç |
| | | /// <summary> |
| | | /// Button æé® |
| | | /// </summary> |
| | | public class ImageView : View |
| | | { |
| | | /// <summary> |
| | | /// å½åè§å¾ |
| | | /// </summary> |
| | | /// <value>The android button.</value> |
| | | AndroidImageView currentButton |
| | | { |
| | | get |
| | | { |
| | | return AndroidView as AndroidImageView; |
| | | } |
| | | set |
| | | { |
| | | AndroidView = value; |
| | | } |
| | | } |
| | | |
| | | /// <summary> |
| | | /// æé 彿° |
| | | /// </summary> |
| | | public ImageView() |
| | | { |
| | | currentButton = new AndroidImageView(Application.Activity, this); |
| | | } |
| | | |
| | | internal string imagePath,tempImagePath; |
| | | /// <summary> |
| | | /// ééä¸ç¶æçèæ¯å¾è·¯å¾ |
| | | /// </summary> |
| | | /// <value>The un selected image path.</value> |
| | | public string ImagePath |
| | | { |
| | | get |
| | | { |
| | | return imagePath; |
| | | } |
| | | set |
| | | { |
| | | tempImagePath = value; |
| | | if(!IsCanRefresh){ |
| | | return; |
| | | } |
| | | if (imageBytes != null) |
| | | { |
| | | (AndroidView as AndroidImageView).SetImageDrawable(Bytes2Drawable(imageBytes)); |
| | | return; |
| | | } |
| | | if (ImagePath == value) { |
| | | return; |
| | | } |
| | | imagePath=value; |
| | | Background(value); |
| | | } |
| | | } |
| | | |
| | | byte[] imageBytes; |
| | | public byte[] ImageBytes |
| | | { |
| | | get |
| | | { |
| | | return imageBytes; |
| | | } |
| | | set |
| | | { |
| | | imageBytes = value; |
| | | ImagePath = tempImagePath; |
| | | } |
| | | } |
| | | |
| | | public override uint Radius |
| | | { |
| | | get |
| | | { |
| | | return base.Radius; |
| | | } |
| | | set |
| | | { |
| | | base.Radius = value; |
| | | if (!IsCanRefresh && Radius == value) |
| | | { |
| | | return; |
| | | } |
| | | currentButton.Invalidate(); |
| | | } |
| | | } |
| | | |
| | | public override void Refresh() |
| | | { |
| | | base.Refresh(); |
| | | ImagePath = tempImagePath; |
| | | } |
| | | } |
| | | public class AndroidImageView : Android.Widget.ImageView |
| | | { |
| | | public override bool OnTouchEvent(MotionEvent e) |
| | | { |
| | | base.OnTouchEvent(e); |
| | | if (view != null) |
| | | { |
| | | view.TouchEvent(e); |
| | | } |
| | | return true; |
| | | } |
| | | /** |
| | | * å¾ççç±»åï¼åå½¢oråè§ |
| | | */ |
| | | private int type=TYPE_ROUND; |
| | | public static int TYPE_CIRCLE = 0; |
| | | public static int TYPE_ROUND = 1; |
| | | /** |
| | | * åè§å¤§å°çé»è®¤å¼ |
| | | */ |
| | | private static int BODER_RADIUS_DEFAULT = 10; |
| | | |
| | | /** |
| | | * ç»å¾çPaint |
| | | */ |
| | | private Paint mBitmapPaint; |
| | | /** |
| | | * åè§çåå¾ |
| | | */ |
| | | private int mRadius; |
| | | /** |
| | | * 3x3 ç©éµï¼ä¸»è¦ç¨äºç¼©å°æ¾å¤§ |
| | | */ |
| | | private Matrix mMatrix; |
| | | /** |
| | | * 渲æå¾åï¼ä½¿ç¨å¾å为ç»å¶å¾å½¢çè² |
| | | */ |
| | | private BitmapShader mBitmapShader; |
| | | /** |
| | | * viewç宽度 |
| | | */ |
| | | private int mWidth; |
| | | private RectF mRoundRect; |
| | | |
| | | View view; |
| | | public AndroidImageView(Context context, View view) |
| | | : base(context) |
| | | { |
| | | this.view = view; |
| | | mMatrix = new Matrix(); |
| | | mBitmapPaint = new Paint(); |
| | | mBitmapPaint.AntiAlias = true; |
| | | |
| | | //TypedArray a = context.obtainStyledAttributes(attrs, |
| | | // R.styleable.RoundImageView); |
| | | |
| | | //mBorderRadius = a.getDimensionPixelSize( |
| | | // R.styleable.RoundImageView_borderRadius, (int)TypedValue |
| | | // .applyDimension(TypedValue.COMPLEX_UNIT_DIP, |
| | | // BODER_RADIUS_DEFAULT, getResources() |
| | | // .getDisplayMetrics()));// é»è®¤ä¸º10dp |
| | | //type = a.getInt(R.styleable.RoundImageView_type, TYPE_CIRCLE);// é»è®¤ä¸ºCircle |
| | | |
| | | //a.recycle(); |
| | | } |
| | | |
| | | protected override void OnMeasure(int widthMeasureSpec, int heightMeasureSpec) |
| | | { |
| | | base.OnMeasure(widthMeasureSpec, heightMeasureSpec); |
| | | |
| | | ///** |
| | | // * å¦æç±»åæ¯åå½¢ï¼åå¼ºå¶æ¹åviewç宽é«ä¸è´ï¼ä»¥å°å¼ä¸ºå |
| | | // */ |
| | | if (type == TYPE_CIRCLE) |
| | | { |
| | | mWidth = Math.Min(MeasuredWidth, MeasuredHeight); |
| | | mRadius = mWidth / 2; |
| | | SetMeasuredDimension(mWidth, mWidth); |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * åå§åBitmapShader |
| | | */ |
| | | private void setUpShader() |
| | | { |
| | | Drawable drawable = this.Drawable; |
| | | if (drawable == null) |
| | | { |
| | | return; |
| | | } |
| | | |
| | | Bitmap bmp = drawableToBitamp(drawable); |
| | | if (bmp == null) |
| | | { |
| | | return; |
| | | } |
| | | // å°bmpä½ä¸ºçè²å¨ï¼å°±æ¯å¨æå®åºåå
ç»å¶bmp |
| | | mBitmapShader = new BitmapShader(bmp, Shader.TileMode.Clamp, Shader.TileMode.Clamp); |
| | | float scale = 1.0f; |
| | | if (type == TYPE_CIRCLE) |
| | | { |
| | | // æ¿å°bitmap宽æé«çå°å¼ |
| | | int bSize = Math.Min(bmp.Width, bmp.Height); |
| | | scale = mWidth * 1.0f / bSize; |
| | | |
| | | } |
| | | else if (type == TYPE_ROUND) |
| | | { |
| | | //Log.e("TAG", |
| | | //"b'w = " + bmp.getWidth() + " , " + "b'h = " |
| | | //+ bmp.getHeight()); |
| | | if (!(bmp.Width == Width && bmp.Height == Height)) |
| | | { |
| | | // 妿å¾çç宽æè
é«ä¸viewç宽é«ä¸å¹é
ï¼è®¡ç®åºéè¦ç¼©æ¾çæ¯ä¾ï¼ç¼©æ¾åçå¾çç宽é«ï¼ä¸å®è¦å¤§äºæä»¬viewç宽é«ï¼æä»¥æä»¬è¿éå大å¼ï¼ |
| | | scale = Math.Max(Width * 1.0f / bmp.Width, |
| | | Height * 1.0f / bmp.Height); |
| | | } |
| | | } |
| | | // shaderç忢ç©éµï¼æä»¬è¿é主è¦ç¨äºæ¾å¤§æè
ç¼©å° |
| | | mMatrix.SetScale(scale, scale); |
| | | // è®¾ç½®åæ¢ç©éµ |
| | | mBitmapShader.SetLocalMatrix(mMatrix); |
| | | // 设置shader |
| | | mBitmapPaint.SetShader(mBitmapShader); |
| | | } |
| | | |
| | | protected override void OnDraw(Canvas canvas) |
| | | { |
| | | // Log.e("TAG", "onDraw"); |
| | | if (Drawable == null) |
| | | { |
| | | return; |
| | | } |
| | | setUpShader(); |
| | | |
| | | if (type == TYPE_ROUND) |
| | | { |
| | | canvas.DrawRoundRect(mRoundRect, view.Radius, view.Radius, |
| | | mBitmapPaint); |
| | | } |
| | | else |
| | | { |
| | | canvas.DrawCircle(mRadius, mRadius, mRadius, mBitmapPaint); |
| | | // drawSomeThing(canvas); |
| | | } |
| | | } |
| | | |
| | | |
| | | protected override void OnSizeChanged(int w, int h, int oldw, int oldh) |
| | | { |
| | | base.OnSizeChanged(w, h, oldw, oldh); |
| | | |
| | | // åè§å¾ççèå´ |
| | | if (type == TYPE_ROUND) |
| | | mRoundRect = new RectF(0, 0, w, h); |
| | | } |
| | | |
| | | /** |
| | | * drawable转bitmap |
| | | * |
| | | * @param drawable |
| | | * @return |
| | | */ |
| | | private Bitmap drawableToBitamp(Drawable drawable) |
| | | { |
| | | if (drawable.GetType() == typeof(BitmapDrawable)) |
| | | { |
| | | BitmapDrawable bd = (BitmapDrawable)drawable; |
| | | return bd.Bitmap; |
| | | } |
| | | int w = drawable.IntrinsicWidth; |
| | | int h = drawable.IntrinsicHeight; |
| | | if (w <= 0 || h <= 0) |
| | | { |
| | | return null; |
| | | } |
| | | Bitmap bitmap = Bitmap.CreateBitmap(w, h, Bitmap.Config.Argb8888); |
| | | Canvas canvas = new Canvas(bitmap); |
| | | drawable.SetBounds(0, 0, w, h); |
| | | drawable.Draw(canvas); |
| | | return bitmap; |
| | | } |
| | | |
| | | private static string STATE_INSTANCE = "state_instance"; |
| | | private static string STATE_TYPE = "state_type"; |
| | | private static string STATE_BORDER_RADIUS = "state_border_radius"; |
| | | |
| | | |
| | | |
| | | protected override IParcelable OnSaveInstanceState() |
| | | { |
| | | Bundle bundle = new Bundle(); |
| | | bundle.PutParcelable(STATE_INSTANCE, base.OnSaveInstanceState()); |
| | | bundle.PutInt(STATE_TYPE, type); |
| | | bundle.PutInt(STATE_BORDER_RADIUS, (int)view.Radius); |
| | | return bundle; |
| | | } |
| | | |
| | | protected override void OnRestoreInstanceState(IParcelable state) |
| | | { |
| | | if (state.GetType() == typeof(Bundle)) |
| | | { |
| | | Bundle bundle = (Bundle)state; |
| | | base.OnRestoreInstanceState((IParcelable)bundle |
| | | .GetParcelable(STATE_INSTANCE)); |
| | | this.type = bundle.GetInt(STATE_TYPE); |
| | | view.Radius = (uint)bundle.GetInt(STATE_BORDER_RADIUS); |
| | | } |
| | | else |
| | | { |
| | | base.OnRestoreInstanceState(state); |
| | | } |
| | | } |
| | | |
| | | |
| | | public void setType(int type) |
| | | { |
| | | if (this.type != type) |
| | | { |
| | | this.type = type; |
| | | if (this.type != TYPE_ROUND && this.type != TYPE_CIRCLE) |
| | | { |
| | | this.type = TYPE_CIRCLE; |
| | | } |
| | | RequestLayout(); |
| | | } |
| | | |
| | | } |
| | | |
| | | public int dp2px(int dpVal) |
| | | { |
| | | return (int)TypedValue.ApplyDimension(ComplexUnitType.Dip, |
| | | dpVal, Resources.DisplayMetrics); |
| | | } |
| | | } |
| | | } |
New file |
| | |
| | | using System; |
| | | using System.IO; |
| | | |
| | | namespace Shared |
| | | { |
| | | public static class Language |
| | | { |
| | | static System.Collections.Generic.List<string> currentStringList; |
| | | static Language() |
| | | { |
| | | UpdateLanguage (); |
| | | if (0 < currentStringList.Count&¤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(); |
| | | } |
| | | } |
| | | } |
| | | |
New file |
| | |
| | | using System; |
| | | using Android.Content; |
| | | using Android.Runtime; |
| | | using Android.Widget; |
| | | using Android.Util; |
| | | using Android.Views; |
| | | using Android.Graphics.Drawables; |
| | | |
| | | namespace Shared |
| | | { |
| | | public class Loading : View |
| | | { |
| | | public bool CurStatus = false; |
| | | |
| | | public Loading () |
| | | { |
| | | AndroidView = new MyLoading (Application.Activity); |
| | | CurStatus = false; |
| | | } |
| | | /// <summary> |
| | | /// Refresh this instance. |
| | | /// </summary> |
| | | public override void Refresh () |
| | | { |
| | | base.Refresh (); |
| | | Hide (); |
| | | } |
| | | /// <summary> |
| | | /// Hide this instance. |
| | | /// </summary> |
| | | public void Hide () |
| | | { |
| | | (AndroidView as MyLoading).textView.Text = "Loading......"; |
| | | AndroidView.Visibility = Android.Views.ViewStates.Gone; |
| | | CurStatus = false; |
| | | } |
| | | |
| | | /// <summary> |
| | | /// Start this instance. |
| | | /// </summary> |
| | | public void Start () |
| | | { |
| | | (AndroidView as MyLoading).textView.Text = "Loading......"; |
| | | AndroidView.BringToFront (); |
| | | AndroidView.Visibility = ViewStates.Visible; |
| | | CurStatus = true; |
| | | } |
| | | |
| | | /// <summary> |
| | | /// Start this instance. |
| | | /// </summary> |
| | | public void Start (string s) |
| | | { |
| | | (AndroidView as MyLoading).textView.Text = s; |
| | | AndroidView.BringToFront (); |
| | | AndroidView.Visibility = ViewStates.Visible; |
| | | } |
| | | |
| | | public string Text { |
| | | get { |
| | | return (AndroidView as MyLoading).textView.Text; |
| | | } |
| | | set { |
| | | (AndroidView as MyLoading).textView.Text = value; |
| | | } |
| | | } |
| | | |
| | | public virtual uint LodingBackgroundColor { |
| | | get { |
| | | return (AndroidView as MyLoading).LodingBackgroundColor; |
| | | } |
| | | set { |
| | | (AndroidView as MyLoading).LodingBackgroundColor = value; |
| | | } |
| | | } |
| | | } |
| | | |
| | | class MiddleLinearLayout : LinearLayout |
| | | { |
| | | public MiddleLinearLayout (Context context) |
| | | : base (context) |
| | | { |
| | | } |
| | | |
| | | int mMaxWidth { |
| | | get { |
| | | var metric = new DisplayMetrics (); |
| | | Application.Activity.WindowManager.DefaultDisplay.GetRealMetrics (metric); |
| | | return metric.WidthPixels * 3 / 4; |
| | | } |
| | | } |
| | | |
| | | protected override void OnMeasure (int widthMeasureSpec, int heightMeasureSpec) |
| | | { |
| | | var widthMode = MeasureSpec.GetMode (widthMeasureSpec); |
| | | var widthSize = MeasureSpec.GetSize (widthMeasureSpec); |
| | | if (widthMode == MeasureSpecMode.Exactly) { |
| | | widthSize = widthSize <= mMaxWidth ? widthSize |
| | | |
| | | : (int)mMaxWidth; |
| | | } |
| | | |
| | | if (widthMode == MeasureSpecMode.Unspecified) { |
| | | widthSize = widthSize <= mMaxWidth ? widthSize |
| | | |
| | | : (int)mMaxWidth; |
| | | } |
| | | if (widthMode == MeasureSpecMode.AtMost) { |
| | | widthSize = widthSize <= mMaxWidth ? widthSize |
| | | |
| | | : (int)mMaxWidth; |
| | | } |
| | | var maxWidthMeasureSpec = MeasureSpec.MakeMeasureSpec (widthSize, |
| | | widthMode); |
| | | base.OnMeasure (maxWidthMeasureSpec, heightMeasureSpec); |
| | | } |
| | | } |
| | | |
| | | |
| | | class MyLoading : Android.Widget.LinearLayout |
| | | { |
| | | ProgressBar Progress; |
| | | public Android.Widget.TextView textView; |
| | | LinearLayout tempLinearLayout; |
| | | |
| | | public MyLoading (Context context) |
| | | : base (context) |
| | | { |
| | | //Progress = new ProgressBar(context); |
| | | //SetBackgroundColor(Android.Graphics.Color.Argb(50, 0x32, 0x32, 0x32)); |
| | | //SetGravity(GravityFlags.Center); |
| | | //tempLinearLayout = new LinearLayout(context) { Orientation = Orientation.Vertical }; |
| | | |
| | | //tempLinearLayout.SetGravity(GravityFlags.CenterHorizontal); |
| | | //tempLinearLayout.AddView(Progress, new Android.Views.ViewGroup.LayoutParams(Android.Views.ViewGroup.LayoutParams.WrapContent, Android.Views.ViewGroup.LayoutParams.WrapContent)); |
| | | //textView = new Android.Widget.TextView(context); |
| | | //textView.Text = "Please wait...."; |
| | | //tempLinearLayout.AddView(textView, new Android.Views.ViewGroup.LayoutParams(Android.Views.ViewGroup.LayoutParams.WrapContent, Android.Views.ViewGroup.LayoutParams.WrapContent)); |
| | | //AddView(tempLinearLayout, new Android.Views.ViewGroup.LayoutParams(Android.Views.ViewGroup.LayoutParams.WrapContent, Android.Views.ViewGroup.LayoutParams.WrapContent)); |
| | | //tempLinearLayout.SetPadding(20, 20, 20, 20); |
| | | Progress = new ProgressBar (context); |
| | | SetBackgroundColor (Android.Graphics.Color.Argb (50, 0x32, 0x32, 0x32)); |
| | | SetGravity (GravityFlags.Center); |
| | | tempLinearLayout = new MiddleLinearLayout (context) { Orientation = Orientation.Vertical }; |
| | | |
| | | tempLinearLayout.SetGravity (GravityFlags.CenterHorizontal); |
| | | tempLinearLayout.AddView (Progress, new Android.Views.ViewGroup.LayoutParams (Android.Views.ViewGroup.LayoutParams.WrapContent, Android.Views.ViewGroup.LayoutParams.WrapContent)); |
| | | textView = new Android.Widget.TextView (context); |
| | | textView.Text = "Loading......"; |
| | | tempLinearLayout.AddView (textView, new Android.Views.ViewGroup.LayoutParams (Android.Views.ViewGroup.LayoutParams.WrapContent, Android.Views.ViewGroup.LayoutParams.WrapContent)); |
| | | AddView (tempLinearLayout, new Android.Views.ViewGroup.LayoutParams (Android.Views.ViewGroup.LayoutParams.WrapContent, Android.Views.ViewGroup.LayoutParams.WrapContent)); |
| | | tempLinearLayout.SetPadding (20, 20, 20, 20); |
| | | } |
| | | |
| | | uint loadingBackgroundColor; |
| | | /// <summary> |
| | | /// èæ¯é¢è² |
| | | /// </summary> |
| | | /// <value>The color of the background.</value> |
| | | public virtual uint LodingBackgroundColor { |
| | | get { |
| | | return loadingBackgroundColor; |
| | | } |
| | | set { |
| | | loadingBackgroundColor = value; |
| | | |
| | | if (this.GetType () != typeof (ImageView)) { |
| | | if (tempLinearLayout.Background == null || tempLinearLayout.Background.GetType () != typeof (GradientDrawable)) { |
| | | tempLinearLayout.Background = new Android.Graphics.Drawables.GradientDrawable (); |
| | | } |
| | | |
| | | var gradientDrawable = (GradientDrawable)tempLinearLayout.Background; |
| | | gradientDrawable.SetCornerRadius (DensityUtil.Dip2Px (6)); |
| | | byte r, g, b, a; |
| | | |
| | | r = (byte)(loadingBackgroundColor / 256 / 256 % 256); |
| | | g = (byte)(loadingBackgroundColor / 256 % 256); |
| | | b = (byte)(loadingBackgroundColor % 256); |
| | | a = (byte)(loadingBackgroundColor / 256 / 256 / 256 % 256); |
| | | gradientDrawable.SetColor (Android.Graphics.Color.Argb (a, r, g, b).ToArgb ()); |
| | | } |
| | | } |
| | | } |
| | | |
| | | /// <summary> |
| | | /// ç¹å»äºä»¶ |
| | | /// </summary> |
| | | /// <returns>The touch event.</returns> |
| | | /// <param name="e">E.</param> |
| | | public override bool OnTouchEvent (Android.Views.MotionEvent e) |
| | | { |
| | | //äºä»¶èªå·±å¤ç |
| | | return true; |
| | | } |
| | | } |
| | | } |
New file |
| | |
| | | using System; |
| | | using Android.Content; |
| | | using Android.Views; |
| | | using Android.Views.Animations; |
| | | |
| | | namespace Shared |
| | | { |
| | | /// <summary> |
| | | /// é³ä¹æ»å¨è§å¾ |
| | | /// </summary> |
| | | public class MusicVerticalScrolViewLayout : ViewGroup |
| | | { |
| | | /// <summary> |
| | | /// æé 彿° |
| | | /// </summary> |
| | | public MusicVerticalScrolViewLayout() |
| | | { |
| | | viewGroup = new AndroidScrolView11(Application.Activity, this); |
| | | var tempViewGroup = new Android.Widget.FrameLayout(Application.Activity); |
| | | //ScrollViewè¿æ ·çæ§ä»¶éè¦å
æä¸ªå®¹å¨ï¼èä¸å®¹å¨é«å®½ä¸è½è®¾å®ï¼èæ¯ç±å®¹å¨éçåæ§ä»¶é«åº¦å³å® |
| | | viewGroup.AddView(tempViewGroup); |
| | | realViewGroup = new Android.Widget.FrameLayout(Application.Activity); |
| | | tempViewGroup.AddView(realViewGroup); |
| | | } |
| | | |
| | | //è¿ä¸ªæ¹æ³æ£æ¥è¿æ²¡æé®é¢ |
| | | /// <summary> |
| | | /// æ·»å åæ§ä»¶ |
| | | /// </summary> |
| | | /// <param name="view">View.</param> |
| | | public override void AddChidren(View view) |
| | | { |
| | | base.AddChidren(view); |
| | | int height = 0; |
| | | foreach(View tempView in viewList){ |
| | | if(height<tempView.Bottom) |
| | | { |
| | | height = tempView.Bottom; |
| | | } |
| | | } |
| | | realViewGroup.LayoutParameters.Height = height < viewGroup.LayoutParameters.Height ? viewGroup.LayoutParameters.Height+10 : height; |
| | | } |
| | | |
| | | /// <summary> |
| | | /// æ ¹æ®ç»å¯¹åæ æ¥ç¡®å®å½åéæ©äºåªä¸ªæ§ä»¶ |
| | | /// </summary> |
| | | /// <returns><c>true</c>, if range of view was ined, <c>false</c> otherwise.</returns> |
| | | /// <param name="view">View.</param> |
| | | /// <param name="point">Point.</param> |
| | | bool inRangeOfView(Android.Views.View view, Android.Graphics.Point point) |
| | | { |
| | | var location = new int[2]; |
| | | view.GetLocationOnScreen(location); |
| | | int y = location[1]; |
| | | if (point.Y < y || point.Y > (y + view.Height)) |
| | | { |
| | | return false; |
| | | } |
| | | return true; |
| | | } |
| | | |
| | | bool isSameZone (Android.Views.View view) |
| | | { |
| | | var location = new int [2]; |
| | | view.GetLocationOnScreen (location); |
| | | int y = location [1]; |
| | | if (y + view.Height / 2 < selectViewBeforeY || y > selectViewBeforeY + view.Height / 2) { |
| | | return false; |
| | | } |
| | | return true; |
| | | } |
| | | |
| | | /// <summary> |
| | | /// æ ¹æ®ç¹å»ä½ç½®æ¾åºç¹å»å°çè§å¾ |
| | | /// </summary> |
| | | /// <returns>The view of point.</returns> |
| | | /// <param name="point">Point.</param> |
| | | /// <param name="view">Uiview.</param> |
| | | Android.Views.View replaceViewOfPoint(Android.Views.View view, Android.Graphics.Point point) |
| | | { |
| | | //第ä¸ä¸ªæ¯èæ¯å¾ |
| | | for (int i = realViewGroup.ChildCount - 1; 0 <= i; i--) |
| | | { |
| | | var tempView = realViewGroup.GetChildAt(i); |
| | | if (tempView != view) |
| | | { |
| | | if (inRangeOfView(tempView, point)) |
| | | { |
| | | return tempView; |
| | | } |
| | | } |
| | | } |
| | | return null; |
| | | } |
| | | |
| | | /// <summary> |
| | | /// |
| | | /// </summary> |
| | | public Action<View, View> ReplaceChanged; |
| | | /// <summary> |
| | | /// é¿æäºä»¶ |
| | | /// </summary> |
| | | public Action<View> LongPressAction; |
| | | |
| | | /// <summary> |
| | | /// æ ¹æ®ç¹å»ä½ç½®æ¾åºç¹å»å°çè§å¾ |
| | | /// </summary> |
| | | /// <returns>è¿åç¹å»å°çè§å¾</returns> |
| | | /// <param name="point">å½åç¹å»ä½ç½®</param> |
| | | Android.Views.View selectedViewByPoint(Android.Graphics.Point point) |
| | | { |
| | | //第ä¸ä¸ªæ¯èæ¯å¾ |
| | | for (int i = realViewGroup.ChildCount - 1; 0 <= i; i--) |
| | | { |
| | | var tempView = realViewGroup.GetChildAt(i); |
| | | { |
| | | if (inRangeOfView(tempView, point)) |
| | | { |
| | | return tempView; |
| | | } |
| | | } |
| | | } |
| | | return null; |
| | | } |
| | | /// <summary> |
| | | /// å½åé䏿é®çåå§ç¹ |
| | | /// </summary> |
| | | Android.Graphics.Point originPressPoint; |
| | | |
| | | /// <summary> |
| | | /// å½åéä¸çè§å¾èµ·ç¹ |
| | | /// </summary> |
| | | Android.Graphics.Point selectedViewPoint; |
| | | |
| | | /// <summary> |
| | | /// å½åéä¸çè§å¾ |
| | | /// </summary> |
| | | Android.Views.View selectedAndroidView; |
| | | /// <summary> |
| | | /// åå¤äº¤æ¢ä½ç½®çè§å¾ |
| | | /// </summary> |
| | | Android.Views.View replaceAndroidView; |
| | | |
| | | /// <summary> |
| | | /// è·åå½åViewçä¸å¿ç¹ |
| | | /// </summary> |
| | | /// <returns>The point.</returns> |
| | | /// <param name="view">View.</param> |
| | | Android.Graphics.Point centerPoint(Android.Views.View view) |
| | | { |
| | | int[] location = new int[2]; |
| | | view.GetLocationOnScreen(location); |
| | | int x = location[0]; |
| | | int y = location[1]; |
| | | x += view.Width / 2; |
| | | y += view.Height / 2; |
| | | return new Android.Graphics.Point(x, y); |
| | | } |
| | | |
| | | |
| | | float selectViewBeforeY; |
| | | /// <summary> |
| | | /// ç¹å»å¼å§çäºä»¶ |
| | | /// </summary> |
| | | /// <param name="e">E.</param> |
| | | internal void TouchEventDown(MotionEvent e){ |
| | | //æ¾åºå½åç¹å»ä½ç½®çè§å¾ |
| | | selectedAndroidView = selectedViewByPoint(new Android.Graphics.Point((int)e.RawX, (int)e.RawY)); |
| | | if (selectedAndroidView == null) |
| | | { |
| | | return ; |
| | | } |
| | | selectedAndroidView.BringToFront(); |
| | | var location = new int [2]; |
| | | selectedAndroidView.GetLocationOnScreen (location); |
| | | selectViewBeforeY = location [1]; |
| | | originPressPoint = new Android.Graphics.Point((int)e.RawX, (int)e.RawY); |
| | | selectedViewPoint = new Android.Graphics.Point((int)selectedAndroidView.GetX(), (int)selectedAndroidView.GetY()); |
| | | isFirst = true; |
| | | } |
| | | /// <summary> |
| | | /// ç¹å»äºä»¶ç§»å¨ |
| | | /// </summary> |
| | | /// <param name="e">E.</param> |
| | | internal void TouchEventMove(MotionEvent e) |
| | | { |
| | | if (selectedAndroidView == null) |
| | | { |
| | | return; |
| | | } |
| | | //selectedAndroidView.SetX(selectedViewPoint.X + e.RawX - originPressPoint.X); |
| | | selectedAndroidView.SetY(selectedViewPoint.Y + e.RawY - originPressPoint.Y); |
| | | //è·åå½åè§å¾è¿å
¥äºåªä¸ªè§å¾çåºå |
| | | replaceAndroidView = replaceViewOfPoint(selectedAndroidView, centerPoint(selectedAndroidView)); |
| | | if (replaceAndroidView != null) |
| | | { |
| | | if (!isFirst) |
| | | { |
| | | return; |
| | | } |
| | | isFirst = false; |
| | | if (replaceAndroidView == null) |
| | | { |
| | | return; |
| | | } |
| | | replaceAndroidView.ClearAnimation(); |
| | | /** 设置缩æ¾å¨ç» */ |
| | | replaceAndroidView.Animation = new AlphaAnimation(1.0f, .8f); |
| | | replaceAndroidView.Animation.Duration = 1000; |
| | | replaceAndroidView.Animation.StartNow(); |
| | | } |
| | | } |
| | | /// <summary> |
| | | /// ç¹å»äºä»¶å¼¹èµ· |
| | | /// </summary> |
| | | /// <param name="e">E.</param> |
| | | internal void TouchEventUp(MotionEvent e) |
| | | { |
| | | if (selectedAndroidView == null) |
| | | { |
| | | return; |
| | | } |
| | | View selectedView = null; |
| | | foreach (View view in viewList) |
| | | { |
| | | if (view.AndroidView == selectedAndroidView) |
| | | { |
| | | selectedView = view; |
| | | break; |
| | | } |
| | | } |
| | | |
| | | //selectedAndroidView.SetX(selectedViewPoint.X); |
| | | |
| | | |
| | | if(isSameZone(selectedAndroidView)) |
| | | { |
| | | selectedAndroidView.SetY (selectedViewPoint.Y); |
| | | return; |
| | | } |
| | | selectedAndroidView.SetY (selectedViewPoint.Y); |
| | | |
| | | |
| | | if (replaceAndroidView == null) |
| | | { |
| | | if (LongPressAction != null) |
| | | { |
| | | LongPressAction(selectedView); |
| | | } |
| | | return; |
| | | } |
| | | |
| | | View replaceView = null; |
| | | foreach (View view in viewList) |
| | | { |
| | | if (view.AndroidView == replaceAndroidView) |
| | | { |
| | | replaceView = view; |
| | | break; |
| | | } |
| | | } |
| | | if (ReplaceChanged != null) |
| | | { |
| | | ReplaceChanged(replaceView, selectedView); |
| | | } |
| | | } |
| | | |
| | | /// <summary> |
| | | /// ç»å½åéæ©ä¸çæ§ä»¶ä¸ªå¨ç»ç¼©å°çææ |
| | | /// </summary> |
| | | internal void scaleSelectedAndroidView() |
| | | { |
| | | if (selectedAndroidView == null) |
| | | { |
| | | return; |
| | | } |
| | | selectedAndroidView.ClearAnimation(); |
| | | /** 设置缩æ¾å¨ç» */ |
| | | selectedAndroidView.Animation = new AlphaAnimation(1.0f, 0.8f); |
| | | selectedAndroidView.Animation.Duration = 1000; |
| | | selectedAndroidView.Animation.StartNow(); |
| | | } |
| | | |
| | | /// <summary> |
| | | /// æ¯å¦ç¬¬ä¸æ¬¡å è½½ |
| | | /// </summary> |
| | | bool isFirst; |
| | | |
| | | /// <summary> |
| | | /// ç«ç´æ¹åæ»å¨æ§ä»¶ |
| | | /// </summary> |
| | | internal class AndroidScrolView11 : Android.Widget.ScrollView, GestureDetector.IOnGestureListener |
| | | { |
| | | MusicVerticalScrolViewLayout _view; |
| | | /// <summary> |
| | | /// æ¯å¦é¿æ |
| | | /// </summary> |
| | | bool isLongPress; |
| | | GestureDetector mGesture; |
| | | |
| | | |
| | | /// <summary> |
| | | /// æé 彿° |
| | | /// </summary> |
| | | /// <param name="context">Context.</param> |
| | | /// <param name="view">View.</param> |
| | | public AndroidScrolView11(Context context, MusicVerticalScrolViewLayout view) |
| | | : base(context) |
| | | { |
| | | _view = view; |
| | | VerticalScrollBarEnabled = false; |
| | | mGesture = new GestureDetector(context, this) { IsLongpressEnabled = true }; |
| | | } |
| | | |
| | | /// <summary> |
| | | /// éåç¹å»äºä»¶ |
| | | /// </summary> |
| | | /// <returns><c>true</c>, if touch event was oned, <c>false</c> otherwise.</returns> |
| | | /// <param name="e">E.</param> |
| | | public override bool OnTouchEvent(MotionEvent e) |
| | | { |
| | | //å¤çé¿æçäºä»¶ |
| | | if (isLongPress) |
| | | { |
| | | switch (e.Action) |
| | | { |
| | | case MotionEventActions.Move: |
| | | _view.TouchEventMove(e); |
| | | break; |
| | | case MotionEventActions.Up: |
| | | _view.TouchEventUp(e); |
| | | break; |
| | | } |
| | | return true; |
| | | } |
| | | |
| | | return base.OnTouchEvent(e); |
| | | } |
| | | |
| | | //æ¯å¦æ¯æ´»å¨ç¶æ |
| | | bool isLive() |
| | | { |
| | | return Enabled && Visibility == ViewStates.Visible && 0 < Alpha; |
| | | } |
| | | |
| | | public override bool OnInterceptTouchEvent(MotionEvent ev) |
| | | { |
| | | if (!isLive()) |
| | | { |
| | | return false; |
| | | } |
| | | mGesture.OnTouchEvent(ev); |
| | | //妿æ¯é¿æï¼å°±æ¦æªäºä»¶ï¼åé¢çäºä»¶æ¯ç±èªå·±çTouchEventå¤çï¼åæ§ä»¶ä¼æ¶å°åæ¶äºä»¶ï¼å¦ææ¯å¿«éæ»å¨ï¼äºä»¶ä¹æ¯èªå·±å¤ç |
| | | if (isLongPress) |
| | | { |
| | | return true; |
| | | } |
| | | //å¦ææ¯æ»å¨è¿éä¹ä¼è¿åTrue |
| | | return base.OnInterceptTouchEvent(ev); |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 设置ææç¶è§å¾ç¦æ¢æ¦æªäºä»¶ |
| | | /// </summary> |
| | | /// <param name="b">å¦æè®¾ç½®True表示ä¸è¦æ¦æªï¼å¦æè®¾ç½®ä¸ºFalse表示å¯ä»¥æ¦æª</param> |
| | | void requestParentDisallowInterceptTouchEvent(bool b) |
| | | { |
| | | var tempParent = Parent; |
| | | while (tempParent != null) |
| | | { //åè¯ç¶ç±»ä¸è¦æ¦æªè¿ä¸ªè§å¾çäºä»¶ |
| | | tempParent.RequestDisallowInterceptTouchEvent(b); |
| | | tempParent = tempParent.Parent; |
| | | } |
| | | } |
| | | |
| | | public bool OnDown(MotionEvent e) |
| | | { |
| | | isLongPress = false; |
| | | _view.TouchEventDown(e); |
| | | requestParentDisallowInterceptTouchEvent(true); |
| | | return false; |
| | | } |
| | | |
| | | public bool OnFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) |
| | | { |
| | | //è¿
éæ»å¨ï¼å¹¶æ¾å¼ |
| | | Console.WriteLine($"OnFlingé便ä¸åï¼åæ åå为X:{velocityX},Y:{velocityY}"); |
| | | return false; |
| | | } |
| | | |
| | | public void OnLongPress(MotionEvent e) |
| | | { |
| | | isLongPress = true; |
| | | _view.scaleSelectedAndroidView(); |
| | | Console.WriteLine("é¿æä¸æ¾"); |
| | | } |
| | | |
| | | public bool OnScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) |
| | | { |
| | | Console.WriteLine("OnScroll:å¨å±å¹ä¸æ»å¨"); |
| | | return false; |
| | | } |
| | | |
| | | public void OnShowPress(MotionEvent e) |
| | | { |
| | | Console.WriteLine("OnShowPress:æææä¸ä¸æ®µæ¶é´ï¼è¿æ²¡å°é¿æ"); |
| | | } |
| | | |
| | | public bool OnSingleTapUp(MotionEvent e) |
| | | { |
| | | requestParentDisallowInterceptTouchEvent(false); |
| | | Console.WriteLine("OnSingleTapUp:ææå¼¹èµ·"); |
| | | return false; |
| | | } |
| | | } |
| | | } |
| | | |
| | | } |
New file |
| | |
| | | using System; |
| | | using Android.Webkit; |
| | | using System.Collections.Generic; |
| | | |
| | | namespace Shared |
| | | { |
| | | /// <summary> |
| | | /// Button æé® |
| | | /// </summary> |
| | | public class MyEchartsView : View |
| | | { |
| | | JsonData jsonData = new JsonData { }; |
| | | public MyEchartsView() |
| | | { |
| | | webView = new MyWebView(Application.Activity, this); |
| | | webView.SetWebViewClient(new MyWebViewClient |
| | | { |
| | | pageFinishedAction = () => |
| | | { |
| | | refresh($"javascript:loadEcharts({Newtonsoft.Json.JsonConvert.SerializeObject(jsonData)},'undefined')"); |
| | | } |
| | | }); |
| | | |
| | | webView.LoadUrl("file:///android_asset/Echarts/index.html"); |
| | | } |
| | | public void Show(string title, string[] xArray, object[] yArray) |
| | | { |
| | | jsonData.Title = title; |
| | | jsonData.XArray = xArray; |
| | | jsonData.YArray = yArray; |
| | | refresh($"javascript:refreshWithOption({ Newtonsoft.Json.JsonConvert.SerializeObject(jsonData)})"); |
| | | } |
| | | |
| | | public string Unit{ |
| | | get{ |
| | | return jsonData.Unit; |
| | | }set{ |
| | | jsonData.Unit = value; |
| | | } |
| | | } |
| | | |
| | | /// <summary> |
| | | /// åæ°çé¢ |
| | | /// </summary> |
| | | void refresh(string js) |
| | | { |
| | | if ((int)Android.OS.Build.VERSION.SdkInt < 18) |
| | | { |
| | | webView.LoadUrl(js); |
| | | } |
| | | else |
| | | { |
| | | webView.EvaluateJavascript(js, webView); |
| | | } |
| | | } |
| | | |
| | | MyWebView webView |
| | | { |
| | | get |
| | | { |
| | | return AndroidView as MyWebView; |
| | | } |
| | | set |
| | | { |
| | | AndroidView = value; |
| | | } |
| | | } |
| | | |
| | | internal class MyWebViewClient : Android.Webkit.WebViewClient |
| | | { |
| | | [Obsolete] |
| | | public override bool ShouldOverrideUrlLoading(Android.Webkit.WebView view, string url) |
| | | { |
| | | view.LoadUrl(url); |
| | | return true; |
| | | } |
| | | public override void OnPageFinished(WebView view, string url) |
| | | { |
| | | base.OnPageFinished(view, url); |
| | | pageFinishedAction?.Invoke(); |
| | | } |
| | | internal Action pageFinishedAction; |
| | | } |
| | | |
| | | class MyWebView : Android.Webkit.WebView, IValueCallback |
| | | { |
| | | View view; |
| | | public MyWebView(Android.Content.Context context, View view) |
| | | : base(context) |
| | | { |
| | | this.view = view; |
| | | SetBackgroundColor(Android.Graphics.Color.Transparent); |
| | | Settings.AllowFileAccess = true; |
| | | Settings.JavaScriptEnabled = true; |
| | | HorizontalScrollBarEnabled = false; |
| | | VerticalScrollBarEnabled = false; |
| | | Settings.SetSupportZoom(true); |
| | | Settings.JavaScriptCanOpenWindowsAutomatically = true; |
| | | } |
| | | |
| | | public void OnReceiveValue(Java.Lang.Object value) |
| | | { |
| | | System.Console.WriteLine("Respone " + value); |
| | | } |
| | | } |
| | | |
| | | [Serializable] |
| | | class JsonData |
| | | { |
| | | /// <summary> |
| | | /// æ é¢å
容 |
| | | /// </summary> |
| | | /// <value>The title.</value> |
| | | [Newtonsoft.Json.JsonIgnore] |
| | | public string Title |
| | | { |
| | | get |
| | | { |
| | | return title["text"].ToString(); |
| | | } |
| | | set |
| | | { |
| | | title["text"] = value; |
| | | } |
| | | } |
| | | [Newtonsoft.Json.JsonProperty] |
| | | readonly Dictionary<string, object> title = new Dictionary<string, object> { ["text"] = "" }; |
| | | [Newtonsoft.Json.JsonProperty] |
| | | readonly Dictionary<string, object> tooltip = new Dictionary<string, object> { ["trigger"] = "axis" }; |
| | | /// <summary> |
| | | /// Xè½´åæ ç¹ |
| | | /// </summary> |
| | | /// <value>The XA rray.</value> |
| | | [Newtonsoft.Json.JsonIgnore] |
| | | public string[] XArray |
| | | { |
| | | get |
| | | { |
| | | return (xAxis[0] as Dictionary<string, object>)["data"] as string[]; |
| | | } |
| | | set |
| | | { |
| | | (xAxis[0] as Dictionary<string, object>)["data"] = value; |
| | | } |
| | | } |
| | | [Newtonsoft.Json.JsonProperty] |
| | | readonly List<object> xAxis = new List<object> { new Dictionary<string, object> { ["type"] = "category", ["boundaryGap"] = false, ["data"] = new object[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 } } }; |
| | | [Newtonsoft.Json.JsonIgnore] |
| | | public string Unit |
| | | { |
| | | get |
| | | { |
| | | return ((yAxis[0] as Dictionary<string, object>)["axisLabel"] as Dictionary<string, object>)["formatter"].ToString().Substring("{value}".Length); |
| | | } |
| | | set |
| | | { |
| | | ((yAxis[0] as Dictionary<string, object>)["axisLabel"] as Dictionary<string, object>)["formatter"] = "{value}" + value; |
| | | } |
| | | } |
| | | [Newtonsoft.Json.JsonProperty] |
| | | readonly List<object> yAxis = new List<object> { new Dictionary<string, object> { ["type"] = "value", ["axisLabel"] = new Dictionary<string, object> { ["formatter"] = "{value}" } } }; |
| | | /// <summary> |
| | | /// Yè½´åæ ç¹ |
| | | /// </summary> |
| | | /// <value>The YA rray.</value> |
| | | [Newtonsoft.Json.JsonIgnore] |
| | | public object[] YArray |
| | | { |
| | | get |
| | | { |
| | | return (series[0] as Dictionary<string, object>)["data"] as object[]; |
| | | } |
| | | set |
| | | { |
| | | (series[0] as Dictionary<string, object>)["data"] = value; |
| | | } |
| | | } |
| | | [Newtonsoft.Json.JsonProperty] |
| | | readonly List<object> series = new List<object> { new Dictionary<string, object> { ["name"] = "Value", ["type"] = "line", ["data"] = new object[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, ["markPoint"] = new Dictionary<string, object> { ["data"] = new List<object> { new Dictionary<string, object> { ["type"] = "max", ["name"] = "Max" }, new Dictionary<string, object> { ["type"] = "min", ["name"] = "Min" } } }, ["markLine"] = new Dictionary<string, object> { ["data"] = new List<object> { new Dictionary<string, object> { ["type"] = "average", ["name"] = "Average" } } } } }; |
| | | } |
| | | } |
| | | } |
New file |
| | |
| | | using System; |
| | | using Android.Views; |
| | | using Android.Content; |
| | | using Android.Widget; |
| | | using Android.Graphics.Drawables; |
| | | using static ViewFlow; |
| | | |
| | | namespace Shared |
| | | { |
| | | //å·²ç»å
¨é¢æ£æ¥äºä»£ç |
| | | /// <summary> |
| | | /// ä½ç½®å¸å± |
| | | /// </summary> |
| | | public class PageLayout : ViewGroup, ViewSwitchListener |
| | | { |
| | | /// <summary> |
| | | /// è§å¾é«åº¦ |
| | | /// </summary> |
| | | /// <value>The height.</value> |
| | | public override int Height { |
| | | get { |
| | | return base.Height; |
| | | } |
| | | set { |
| | | base.Height = value; |
| | | if (!IsCanRefresh) { |
| | | return; |
| | | } |
| | | var layoutParameters = realViewGroup.LayoutParameters; |
| | | layoutParameters.Height = Height; |
| | | realViewGroup.LayoutParameters = layoutParameters; |
| | | } |
| | | } |
| | | |
| | | /// <summary> |
| | | /// è§å¾å®½åº¦ |
| | | /// </summary> |
| | | /// <value>The width.</value> |
| | | public override int Width { |
| | | get { |
| | | return base.Width; |
| | | } |
| | | set { |
| | | base.Width = value; |
| | | if (!IsCanRefresh) { |
| | | return; |
| | | } |
| | | var layoutParameters = realViewGroup.LayoutParameters; |
| | | layoutParameters.Width = Width; |
| | | realViewGroup.LayoutParameters = layoutParameters; |
| | | } |
| | | } |
| | | /// <summary> |
| | | /// 页é¢ååäºä»¶ |
| | | /// </summary> |
| | | public Action<PageLayout, int> PageChange; |
| | | AndroidLinearLayout androidLinearLayout; |
| | | /// <summary> |
| | | /// æé 彿° |
| | | /// </summary> |
| | | public PageLayout () |
| | | { |
| | | viewGroup = new AndroidFrameLayout (Application.Activity, null); |
| | | realViewGroup = new ViewFlow (Application.Activity, this) { }; |
| | | (realViewGroup as ViewFlow).setOnViewSwitchListener (this); |
| | | viewGroup.AddView (realViewGroup); |
| | | androidLinearLayout = new AndroidLinearLayout (Application.Activity, this); |
| | | androidLinearLayout.SetGravity (GravityFlags.Center); |
| | | viewGroup.AddView (androidLinearLayout, new Android.Widget.FrameLayout.LayoutParams (Android.Widget.FrameLayout.LayoutParams.MatchParent, DensityUtil.Dip2Px (30), GravityFlags.Bottom)); |
| | | } |
| | | |
| | | /// <summary> |
| | | /// æ¯å¦æ¾ç¤ºä¸é¢ä¸æçç¹ |
| | | /// </summary> |
| | | /// <value><c>true</c> if is show point; otherwise, <c>false</c>.</value> |
| | | public bool IsShowPoint { |
| | | get { |
| | | return androidLinearLayout.Visibility == ViewStates.Visible; |
| | | } |
| | | set { |
| | | androidLinearLayout.Visibility = value ? ViewStates.Visible : ViewStates.Invisible; |
| | | } |
| | | } |
| | | |
| | | /// <summary> |
| | | /// æ¯å¦å
许æ»å¨ |
| | | /// </summary> |
| | | /// <value><c>true</c> if scroll enabled; otherwise, <c>false</c>.</value> |
| | | public bool ScrollEnabled { |
| | | get { |
| | | return (realViewGroup as ViewFlow).ScrollEnabled; |
| | | } |
| | | set { |
| | | (realViewGroup as ViewFlow).ScrollEnabled = value; |
| | | } |
| | | } |
| | | |
| | | |
| | | int pageIndex; |
| | | /// <summary> |
| | | /// 设置æè
è·åå½åççé¢ç´¢å¼ |
| | | /// </summary> |
| | | /// <value>The index of the page.</value> |
| | | public int PageIndex { |
| | | get { |
| | | return (realViewGroup as ViewFlow).Position; |
| | | } |
| | | set |
| | | { |
| | | if (value < 0 || ChildrenCount < value) |
| | | { |
| | | return; |
| | | } |
| | | int beforePageIndex = pageIndex; |
| | | pageIndex = value; |
| | | if (!IsCanRefresh) |
| | | { |
| | | return; |
| | | } |
| | | |
| | | (realViewGroup as ViewFlow).SetSelection(value); |
| | | } |
| | | } |
| | | |
| | | /// <summary> |
| | | /// å¢å åæ§ä»¶ |
| | | /// </summary> |
| | | /// <param name="view">View.</param> |
| | | public override void AddChidren (View view) |
| | | { |
| | | view.Parent = this; |
| | | viewList.Add (view); |
| | | |
| | | var button = new Android.Widget.Button (Application.Activity); |
| | | int roundRadius = DensityUtil.Dip2Px (5); // åè§åå¾ |
| | | var gd = new GradientDrawable ();//å建drawable |
| | | if(viewList.Count==1){ |
| | | gd.SetColor(Android.Graphics.Color.GhostWhite); |
| | | }else{ |
| | | gd.SetColor(Android.Graphics.Color.Gray); |
| | | } |
| | | gd.SetCornerRadius (roundRadius); |
| | | button.Background = gd; |
| | | var layoutParams = new Android.Widget.LinearLayout.LayoutParams (DensityUtil.Dip2Px (10), DensityUtil.Dip2Px (10)); |
| | | layoutParams.RightMargin = DensityUtil.Dip2Px (10); |
| | | androidLinearLayout.AddView (button, layoutParams); |
| | | |
| | | |
| | | realViewGroup.AddView (view.AndroidView); |
| | | if (!IsCanRefresh) { |
| | | return; |
| | | } |
| | | if (2 <= viewList.Count) { |
| | | view.X = viewList [viewList.Count - 2].Right; |
| | | } |
| | | view.Refresh (); |
| | | //å¦æç¶æ§ä»¶æ¯è¿ç§ï¼å°±å¨æåè¡¥ä¸ä¸ä¸ªæ§ä»¶ |
| | | if (GetType () == typeof (VerticalScrolViewLayout)) { |
| | | int tempHeight = -10; |
| | | foreach (var temp in viewList) { |
| | | tempHeight += temp.Height; |
| | | } |
| | | realViewGroup.AddView (new Android.Widget.LinearLayout (Application.Activity) { Tag = "å¡«å
" }, new Android.Views.ViewGroup.LayoutParams (Android.Views.ViewGroup.LayoutParams.MatchParent, tempHeight < realViewGroup.LayoutParameters.Height ? realViewGroup.LayoutParameters.Height - tempHeight : 0)); |
| | | } |
| | | |
| | | if (view is ViewGroup) { |
| | | var tempViewGroup = (ViewGroup)view; |
| | | for (int i = 0; i < tempViewGroup.ChildrenCount; i++) { |
| | | tempViewGroup.GetChildren (i).Refresh (); |
| | | } |
| | | } |
| | | } |
| | | |
| | | /// <summary> |
| | | /// ç§»é¤å½åæ§ä»¶ |
| | | /// </summary> |
| | | /// <param name="view">View.</param> |
| | | internal override void Remove(View view) |
| | | { |
| | | if (view == null) |
| | | { |
| | | return; |
| | | } |
| | | int index = viewList.FindIndex(obj => obj == view); |
| | | if (index < 0) |
| | | { |
| | | return; |
| | | } |
| | | |
| | | viewList.Remove(view); |
| | | androidLinearLayout.RemoveViewAt(index); |
| | | realViewGroup.RemoveView(view.AndroidView); |
| | | view.Parent = null; |
| | | //new System.Threading.Thread(() => |
| | | //{ |
| | | // Application.RunOnMainThread(() => |
| | | // { |
| | | (realViewGroup as ViewFlow).SetSelection(PageIndex); |
| | | // }); |
| | | |
| | | //}) |
| | | //{ IsBackground = true }.Start(); |
| | | } |
| | | |
| | | /// <summary> |
| | | /// ç§»é¤ææçæ§ä»¶ |
| | | /// </summary> |
| | | public override void RemoveAll () |
| | | { |
| | | while (0 < viewList.Count) { |
| | | GetChildren(0)?.RemoveFromParent(); |
| | | } |
| | | androidLinearLayout.RemoveAllViews (); |
| | | (realViewGroup as ViewFlow).SetSelection(0); |
| | | } |
| | | |
| | | /// <summary> |
| | | /// æ ¹æ®ç´¢å¼ç§»é¤æ§ä»¶ |
| | | /// </summary> |
| | | /// <param name="index">Index.</param> |
| | | public override void RemoveAt (int index) |
| | | { |
| | | if (viewList.Count - 1 < index || index < 0) { |
| | | return; |
| | | } |
| | | androidLinearLayout.RemoveViewAt (index); |
| | | GetChildren(index)?.RemoveFromParent(); |
| | | } |
| | | |
| | | public void onSwitched (Android.Views.View realView, int pageIndex) |
| | | { |
| | | for (int i = 0; i < androidLinearLayout.ChildCount; i++) { |
| | | var view = androidLinearLayout.GetChildAt (i); |
| | | var gradientDrawable = (GradientDrawable)view.Background;//å建drawable |
| | | if (i == pageIndex) { |
| | | gradientDrawable.SetColor (Android.Graphics.Color.GhostWhite); |
| | | } else { |
| | | gradientDrawable.SetColor (Android.Graphics.Color.Gray); |
| | | } |
| | | view.Background = gradientDrawable; |
| | | } |
| | | if (PageChange != null && 0 <= pageIndex) { |
| | | PageChange (this, pageIndex); |
| | | } |
| | | } |
| | | } |
| | | } |
| | | |
| | | |
| | | public class ViewFlow : Android.Widget.FrameLayout |
| | | { |
| | | public bool ScrollEnabled = true; |
| | | static int snapVelocity = 1000; |
| | | static int invalidScreen = -1; |
| | | static int touchStateRest = 0; |
| | | static int touchStateScrolling = 1; |
| | | public int Position |
| | | { |
| | | get |
| | | { |
| | | return position; |
| | | } |
| | | } |
| | | int position; |
| | | Scroller scroller; |
| | | VelocityTracker mVelocityTracker; |
| | | int touchState = touchStateRest; |
| | | float lastMotionX; |
| | | float lastMotionY; |
| | | int mTouchSlop; |
| | | int mMaximumVelocity; |
| | | int mCurrentScreen; |
| | | ViewSwitchListener mViewSwitchListener; |
| | | int mLastScrollDirection; |
| | | int mNextScreen; |
| | | |
| | | |
| | | /** |
| | | * Receives call backs when a new {@link View} has been scrolled to. |
| | | */ |
| | | public interface ViewSwitchListener |
| | | { |
| | | /** |
| | | * This method is called when a new View has been scrolled to. |
| | | * |
| | | * @param view |
| | | * the {@link View} currently in focus. |
| | | * @param position |
| | | * The position in the adapter of the {@link View} currently in focus. |
| | | */ |
| | | void onSwitched(View view, int position); |
| | | |
| | | } |
| | | |
| | | Shared.PageLayout pageLayout; |
| | | public ViewFlow(Context context, Shared.PageLayout view) : base(context) |
| | | { |
| | | pageLayout = view; |
| | | init(); |
| | | } |
| | | |
| | | void init() |
| | | { |
| | | scroller = new Scroller(Context); |
| | | var configuration = ViewConfiguration.Get(Context); |
| | | //æå°çæ»å¨è·ç¦» |
| | | mTouchSlop = configuration.ScaledTouchSlop; |
| | | mMaximumVelocity = configuration.ScaledMaximumFlingVelocity; |
| | | } |
| | | |
| | | ViewFlow childViewFlow |
| | | { |
| | | get |
| | | { |
| | | if (0 < ChildCount) |
| | | { |
| | | var viewGroup = GetChildAt(ChildCount - 1); |
| | | |
| | | } |
| | | return null; |
| | | } |
| | | } |
| | | |
| | | public override void RequestDisallowInterceptTouchEvent(bool disallowIntercept) |
| | | { |
| | | base.RequestDisallowInterceptTouchEvent(disallowIntercept); |
| | | disallowInterceptTouchEvent = disallowIntercept; |
| | | } |
| | | bool disallowInterceptTouchEvent; |
| | | |
| | | bool isFirst; |
| | | public override bool OnInterceptTouchEvent(MotionEvent ev) |
| | | { |
| | | if (disallowInterceptTouchEvent||IsDelay) |
| | | { |
| | | return false; |
| | | } |
| | | System.Console.WriteLine($"PageLayout->OnInterceptTouchEvent:{Height} {ev.Action}"); |
| | | //å¦ææ²¡æåæ§ä»¶æè
ä¸å
许æ»å¨å°±è¿åï¼ä¸å¤çå½åäºä»¶ |
| | | if (ChildCount == 0 || !ScrollEnabled) |
| | | return false; |
| | | |
| | | if (mVelocityTracker == null) |
| | | { |
| | | //åå§åéåº¦æ£æµç±» |
| | | mVelocityTracker = VelocityTracker.Obtain(); |
| | | } |
| | | mVelocityTracker.AddMovement(ev); |
| | | float x = ev.GetX(); |
| | | float y = ev.GetY(); |
| | | switch (ev.Action) |
| | | { |
| | | //æ¯æ¬¡ç¹å»é½æ§è¡è¿é |
| | | case MotionEventActions.Down: |
| | | if (!scroller.IsFinished) |
| | | { |
| | | scroller.AbortAnimation(); |
| | | snapToDestination(false); |
| | | } |
| | | //è®°å½ç¹å»çææ°Xåæ |
| | | lastMotionX = x; |
| | | lastMotionY = y; |
| | | touchState = scroller.IsFinished ? touchStateRest : touchStateScrolling; |
| | | break; |
| | | //æåæ§ä»¶æ¶æ§è¡è¿é |
| | | case MotionEventActions.Move: |
| | | var deltaX = (int)(lastMotionX - x); |
| | | var deltaY = (int)(lastMotionY - y); |
| | | //å½åæ»å¨æ¯å¦å·²ç»è¶
åºäºè®¾å®å¼ |
| | | var xMoved = Math.Abs(deltaX) > mTouchSlop ; |
| | | if (xMoved && Math.Abs(deltaY) < Math.Abs(deltaX)) |
| | | { |
| | | if (!isFirst) |
| | | { |
| | | touchState = touchStateScrolling; |
| | | } |
| | | isFirst = false; |
| | | } |
| | | if (touchState == touchStateScrolling) |
| | | { |
| | | //è®°å½ææ°çåæ ï¼å 为æ¥ä¸æ¥æ§ä»¶å·²ç»æ»å¨äº |
| | | lastMotionX = x; |
| | | |
| | | int scrollX = ScrollX; |
| | | //å峿»å¨ |
| | | if (deltaX < 0) |
| | | { |
| | | //ä¹åå·²ç»æ»å¨çXè½´ |
| | | if (scrollX > 0) |
| | | { |
| | | //å峿»å¨æ¶æ¾ç¤ºåºå·¦è¾¹ççé¢ï¼æä½çé¿åº¦ä¸ºä¹åå·²ç»æ»å¨çè·ç¦» |
| | | ScrollBy(Math.Max(-scrollX, deltaX), 0); |
| | | } |
| | | } |
| | | //åå·¦æ»å¨ |
| | | else if (deltaX > 0) |
| | | { |
| | | //æå°çå³è¾¹éè¦æ»å¨çè·ç¦» |
| | | int availableToScroll = GetChildAt( |
| | | ChildCount - 1).Right |
| | | - PaddingRight - HorizontalFadingEdgeLength |
| | | - scrollX - Width; |
| | | if (availableToScroll > 0) |
| | | { |
| | | ScrollBy(Math.Min(availableToScroll, deltaX), 0); |
| | | } |
| | | } |
| | | //å½åäºä»¶èªå·±å¤çäºï¼åæ§å¶ä¸éè¦å¤çå½åè¿äºä»¶ |
| | | return true; |
| | | } |
| | | break; |
| | | |
| | | case MotionEventActions.Up: |
| | | if (touchState == touchStateScrolling) |
| | | { |
| | | |
| | | mVelocityTracker.ComputeCurrentVelocity(1000, mMaximumVelocity); |
| | | var velocityX = mVelocityTracker.XVelocity; |
| | | |
| | | if (velocityX > snapVelocity && mCurrentScreen > 0) |
| | | { |
| | | // Fling hard enough to move left |
| | | snapToScreen(mCurrentScreen - 1); |
| | | } |
| | | else if (velocityX < -snapVelocity |
| | | && mCurrentScreen < ChildCount - 1) |
| | | { |
| | | // Fling hard enough to move right |
| | | snapToScreen(mCurrentScreen + 1); |
| | | } |
| | | else |
| | | { |
| | | snapToDestination(); |
| | | } |
| | | |
| | | if (mVelocityTracker != null) |
| | | { |
| | | mVelocityTracker.Recycle(); |
| | | mVelocityTracker = null; |
| | | } |
| | | } |
| | | |
| | | touchState = touchStateRest; |
| | | |
| | | break; |
| | | case MotionEventActions.Cancel: |
| | | touchState = touchStateRest; |
| | | break; |
| | | } |
| | | return false; |
| | | } |
| | | |
| | | public bool IsDelay; |
| | | public override bool OnTouchEvent(MotionEvent e) |
| | | { |
| | | if (IsDelay || disallowInterceptTouchEvent) |
| | | { |
| | | return false; |
| | | } |
| | | System.Console.WriteLine($"PageLayout->OnTouchEvent:{Height} {e.Action}"); |
| | | |
| | | if (ChildCount == 0 || !ScrollEnabled) |
| | | return false; |
| | | |
| | | if (mVelocityTracker == null) |
| | | { |
| | | mVelocityTracker = VelocityTracker.Obtain(); |
| | | } |
| | | mVelocityTracker.AddMovement(e); |
| | | |
| | | var x = e.GetX(); |
| | | var y = e.GetY(); |
| | | switch (e.Action) |
| | | { |
| | | case MotionEventActions.Down: |
| | | if (!scroller.IsFinished) |
| | | { |
| | | scroller.AbortAnimation(); |
| | | snapToDestination(false); |
| | | } |
| | | lastMotionX = x; |
| | | lastMotionY = y; |
| | | touchState = scroller.IsFinished ? touchStateRest |
| | | : touchStateScrolling; |
| | | |
| | | break; |
| | | |
| | | case MotionEventActions.Move: |
| | | var deltaX = (int)(lastMotionX - x); |
| | | var deltaY = (int)(lastMotionY - y); |
| | | //å½åæ»å¨æ¯å¦å·²ç»è¶
åºäºè®¾å®å¼ |
| | | var xMoved = Math.Abs(deltaX) > mTouchSlop; |
| | | if (xMoved && Math.Abs(deltaY) < Math.Abs(deltaX)) |
| | | { |
| | | if (!isFirst) |
| | | { |
| | | touchState = touchStateScrolling; |
| | | } |
| | | isFirst = false; |
| | | } |
| | | |
| | | if (touchState == touchStateScrolling) |
| | | { |
| | | lastMotionX = x; |
| | | |
| | | int scrollX = ScrollX; |
| | | if (deltaX < 0) |
| | | { |
| | | if (scrollX > 0) |
| | | { |
| | | ScrollBy(Math.Max(-scrollX, deltaX), 0); |
| | | } |
| | | } |
| | | else if (deltaX > 0) |
| | | { |
| | | int availableToScroll = GetChildAt( |
| | | ChildCount - 1).Right |
| | | - PaddingRight - HorizontalFadingEdgeLength |
| | | - scrollX - screenWidth; |
| | | if (availableToScroll > 0) |
| | | { |
| | | ScrollBy(Math.Min(availableToScroll, deltaX), 0); |
| | | } |
| | | } |
| | | return true; |
| | | } |
| | | break; |
| | | |
| | | case MotionEventActions.Up: |
| | | if (touchState == touchStateScrolling) |
| | | { |
| | | mVelocityTracker.ComputeCurrentVelocity(1000, mMaximumVelocity); |
| | | var velocityX = mVelocityTracker.XVelocity; |
| | | |
| | | if (velocityX > snapVelocity && mCurrentScreen > 0) |
| | | { |
| | | // Fling hard enough to move left |
| | | snapToScreen(mCurrentScreen - 1); |
| | | } |
| | | else if (velocityX < -snapVelocity |
| | | && mCurrentScreen < ChildCount - 1) |
| | | { |
| | | // Fling hard enough to move right |
| | | snapToScreen(mCurrentScreen + 1); |
| | | } |
| | | else |
| | | { |
| | | snapToDestination(); |
| | | } |
| | | |
| | | if (mVelocityTracker != null) |
| | | { |
| | | mVelocityTracker.Recycle(); |
| | | mVelocityTracker = null; |
| | | } |
| | | } |
| | | |
| | | touchState = touchStateRest; |
| | | break; |
| | | case MotionEventActions.Cancel: |
| | | snapToDestination(); |
| | | touchState = touchStateRest; |
| | | break; |
| | | } |
| | | return true; |
| | | } |
| | | |
| | | /// <summary> |
| | | /// åæ§ä»¶ç宽度 |
| | | /// </summary> |
| | | /// <value>The width of the child.</value> |
| | | int screenWidth |
| | | { |
| | | get |
| | | { |
| | | return MeasuredWidth; |
| | | } |
| | | } |
| | | /// <summary> |
| | | /// æ»å¨å°æå®ççé¢ |
| | | /// </summary> |
| | | void snapToDestination(bool isDelay=true) |
| | | { |
| | | int whichScreen = (ScrollX + (screenWidth / 2)) / screenWidth; |
| | | |
| | | snapToScreen(whichScreen,isDelay); |
| | | } |
| | | /// <summary> |
| | | /// æ»å¨å°æå®çé¢ |
| | | /// </summary> |
| | | /// <param name="whichScreen">Which screen.</param> |
| | | void snapToScreen(int whichScreen,bool isDelay=true) |
| | | { |
| | | mLastScrollDirection = whichScreen - mCurrentScreen; |
| | | if (!scroller.IsFinished) |
| | | return; |
| | | |
| | | whichScreen = Math.Max(0, Math.Min(whichScreen, ChildCount - 1)); |
| | | System.Console.WriteLine($"snapToScreen:{whichScreen}"); |
| | | mNextScreen = whichScreen; |
| | | |
| | | int newX = whichScreen * screenWidth; |
| | | int delta = newX - ScrollX; |
| | | scroller.StartScroll(ScrollX, 0, delta, 0, isDelay ? Math.Abs(delta) * 2 : 0); |
| | | Invalidate(); |
| | | } |
| | | |
| | | public override void ComputeScroll() |
| | | { |
| | | if (scroller.ComputeScrollOffset()) |
| | | { |
| | | ScrollTo(scroller.CurrX, scroller.CurrY); |
| | | PostInvalidate(); |
| | | } |
| | | else if (mNextScreen != invalidScreen) |
| | | { |
| | | mCurrentScreen = Math.Max(0, Math.Min(mNextScreen, ChildCount - 1)); |
| | | mNextScreen = invalidScreen; |
| | | postViewSwitched(mLastScrollDirection); |
| | | } |
| | | } |
| | | |
| | | |
| | | |
| | | |
| | | /** |
| | | * Scroll to the {@link View} in the view buffer specified by the index. |
| | | * |
| | | * @param indexInBuffer |
| | | * Index of the view in the view buffer. |
| | | */ |
| | | void setVisibleView(int indexInBuffer, bool uiThread) |
| | | { |
| | | mCurrentScreen = Math.Max(0, Math.Min(indexInBuffer, ChildCount - 1)); |
| | | int dx = (mCurrentScreen * screenWidth) - scroller.CurrX; |
| | | scroller.StartScroll(scroller.CurrX, scroller.CurrY, dx,0, 0); |
| | | |
| | | if (dx == 0) |
| | | OnScrollChanged(scroller.CurrX + dx, scroller.CurrY, scroller.CurrX + dx, scroller.CurrY); |
| | | |
| | | if (uiThread) |
| | | Invalidate(); |
| | | else |
| | | PostInvalidate(); |
| | | } |
| | | |
| | | /** |
| | | * Set the listener that will receive notifications every time the {code |
| | | * ViewFlow} scrolls. |
| | | * |
| | | * @param l |
| | | * the scroll listener |
| | | */ |
| | | public void setOnViewSwitchListener(ViewSwitchListener l) |
| | | { |
| | | mViewSwitchListener = l; |
| | | } |
| | | |
| | | public void SetSelection(int position) |
| | | { |
| | | mNextScreen = invalidScreen; |
| | | scroller.ForceFinished(true); |
| | | var beforePosition = this.position; |
| | | position = Math.Max(position, 0); |
| | | position = Math.Min(position, ChildCount - 1); |
| | | if (position < 0) |
| | | { |
| | | return; |
| | | } |
| | | |
| | | var currentView = GetChildAt(position); |
| | | this.position = position; |
| | | |
| | | setVisibleView(this.position, true); |
| | | RequestLayout(); |
| | | |
| | | if (mViewSwitchListener != null && beforePosition != this.position) |
| | | { |
| | | mViewSwitchListener.onSwitched(currentView, this.position); |
| | | } |
| | | } |
| | | |
| | | void postViewSwitched(int direction) |
| | | { |
| | | if (direction == 0) |
| | | return; |
| | | |
| | | var beforePosition = position; |
| | | |
| | | if (direction > 0) |
| | | { // to the right |
| | | position++; |
| | | position = Math.Min(position, ChildCount - 1); |
| | | |
| | | } |
| | | else |
| | | { // to the left |
| | | position--; |
| | | position = Math.Max(position, 0); |
| | | } |
| | | |
| | | setVisibleView(position, true); |
| | | RequestLayout(); |
| | | |
| | | if (mViewSwitchListener != null && beforePosition != position) |
| | | { |
| | | mViewSwitchListener.onSwitched(GetChildAt(position),position); |
| | | } |
| | | } |
| | | |
| | | bool isHaveSameTypeParent |
| | | { |
| | | get |
| | | { |
| | | var parent = Parent; |
| | | while (parent != null) |
| | | { |
| | | if (parent is ViewFlow) |
| | | { |
| | | return true; |
| | | } |
| | | parent = parent.Parent; |
| | | } |
| | | return false; |
| | | } |
| | | |
| | | } |
| | | |
| | | public override bool DispatchTouchEvent(MotionEvent e) |
| | | { |
| | | //System.Console.WriteLine($"PageLayout->DispatchTouchEvent:{Height} {e.Action}"); |
| | | if(e.Action== MotionEventActions.Down) { |
| | | //è¿å䏿 |
| | | RequestDisallowInterceptTouchEvent(false); |
| | | isFirst = true; |
| | | IsDelay = false; |
| | | } |
| | | if (isHaveSameTypeParent && !isScrolledToBottom) |
| | | { |
| | | //å¦æç¶æ§ä»¶åå½åæ§ä»¶ä¸æ ·ï¼å¹¶ä¸æ²¡ææ»å¨å°åºä¹æ²¡æda |
| | | Parent.RequestDisallowInterceptTouchEvent(true); |
| | | } |
| | | else |
| | | { |
| | | isScrolledToBottom = false; |
| | | Parent.RequestDisallowInterceptTouchEvent(false); |
| | | } |
| | | return base.DispatchTouchEvent(e); |
| | | } |
| | | |
| | | private bool isScrolledToTop = true; // åå§åçæ¶å设置ä¸ä¸å¼ |
| | | private bool isScrolledToBottom; |
| | | |
| | | protected override void OnOverScrolled(int scrollX, int scrollY, bool clampedX, bool clampedY) |
| | | { |
| | | base.OnOverScrolled(scrollX, scrollY, clampedX, clampedY); |
| | | if (scrollY == 0) |
| | | { |
| | | isScrolledToTop = clampedY; |
| | | isScrolledToBottom = false; |
| | | } |
| | | else |
| | | { |
| | | isScrolledToTop = false; |
| | | isScrolledToBottom = clampedY; |
| | | } |
| | | |
| | | } |
| | | |
| | | |
| | | protected override void OnScrollChanged(int l, int t, int oldl, int oldt) |
| | | { |
| | | base.OnScrollChanged(l, t, oldl, oldt); |
| | | if ((int)Android.OS.Build.VERSION.SdkInt < 9) |
| | | { // API 9åä¹åèµ°onOverScrolledæ¹æ³çå¬ |
| | | if (ScrollY == 0) |
| | | { // å°å¿è¸©å1: è¿éä¸è½æ¯getScrollY() <= 0 |
| | | isScrolledToTop = true; |
| | | isScrolledToBottom = false; |
| | | } |
| | | else if (ScrollY + Height - PaddingTop - PaddingBottom == (0 < ChildCount ? GetChildAt(0).Height : Height)) |
| | | { |
| | | // å°å¿è¸©å2: è¿éä¸è½æ¯ >= |
| | | // å°å¿è¸©å3ï¼å¯è½å¿½è§çç»è2ï¼ï¼è¿éæå®¹æå¿½è§çå°±æ¯ScrollViewä¸ä¸çpaddingã |
| | | isScrolledToBottom = true; |
| | | isScrolledToTop = false; |
| | | } |
| | | else |
| | | { |
| | | isScrolledToTop = false; |
| | | isScrolledToBottom = false; |
| | | } |
| | | } |
| | | // ææ¶åå代ç ä¹ æ¯äºï¼ä¸ºäºå
¼å®¹ä¸äºè¾¹çå¥è©æ
åµï¼ä¸é¢ç代ç å°±ä¼åæ<=,>=çæ
åµï¼ç»æå°±åºbugäº |
| | | // æåçæ¶ååæè¿æ ·ï¼getScrollY() + getHeight() >= getChildAt(0).getHeight() |
| | | // ç»æåç°å¿«æ»å¨å°åºé¨ä½æ¯è¿æ²¡å°æ¶ï¼ä¼åç°ä¸é¢çæ¡ä»¶æç«äºï¼å¯¼è´å¤æé误 |
| | | // åå ï¼getScrollY()å¼ä¸æ¯ç»å¯¹é è°±çï¼å®ä¼è¶
è¿è¾¹çå¼ï¼ä½æ¯å®èªå·±ä¼æ¢å¤æ£ç¡®ï¼å¯¼è´ä¸é¢çè®¡ç®æ¡ä»¶ä¸æç« |
| | | // ä»ç»æ³æ³ä¹æè§æ³å¾éï¼ç³»ç»çScrollViewå¨å¤çæ»å¨çæ¶åå¨æè®¡ç®é£ä¸ªscrollYçæ¶åä¹ä¼åºç°è¶
è¿è¾¹çåä¿®æ£çæ
åµ |
| | | } |
| | | } |
| | | |
New file |
| | |
| | | using System; |
| | | using System.Collections.Generic; |
| | | using Com.Hdl.Widget.Pickerview.Builder; |
| | | using Com.Hdl.Widget.Pickerview.Listener; |
| | | using Android.Content; |
| | | |
| | | namespace Shared |
| | | { |
| | | public class PickerView |
| | | { |
| | | //public static void Show(List<KeyValuePair<string, string[]>> list, Action<string> action, string sure = "Sure", string beforeValue = "") |
| | | //{ |
| | | // if (list == null) { |
| | | // return; |
| | | // } |
| | | // var pv = new Shared.Droid.TCL.PickerView(); |
| | | // pv.Show(Application.Activity, list, (obj) => { |
| | | // action?.Invoke(obj); |
| | | // }); |
| | | //} |
| | | |
| | | |
| | | |
| | | /// <summary> |
| | | /// ä¸çº§æ°ç»å¼¹çª æ¯æè®¾ç½®é»è®¤éä¸ç´¢å¼ï¼èªå®ä¹æ é¢ï¼ç¡®è®¤æé®ï¼åæ¶æé®å符 |
| | | /// </summary> |
| | | public static void Show(List<string> mList, Action<int> action, int mSelectIndex1 = 0, string title = "", string sure = "确认", string cancel = "åæ¶") |
| | | { |
| | | if (mList == null) |
| | | { |
| | | return; |
| | | } |
| | | |
| | | |
| | | |
| | | var mOptionsPickerBuilder = new OptionsPickerBuilder(Application.Activity, new OnOptionsSelectListenerCallBack(action)) |
| | | .SetTitleText(title) |
| | | .SetSubmitText(sure) |
| | | .SetCancelText(cancel) |
| | | .SetContentTextSize(20)//设置æ»è½®æåå¤§å° |
| | | .SetSelectOptions(mSelectIndex1) |
| | | //.SetDividerColor(BLACK)//设置åå²çº¿çé¢è² |
| | | //.SetSelectOptions(0, 1)//é»è®¤éä¸é¡¹ |
| | | //.SetBgColor(BLACK) |
| | | //.SetTitleBgColor(BLACK) |
| | | //.SetTitleColor(BLACK) |
| | | //.SetCancelColor(BLACK) |
| | | //.SetSubmitColor(BLACK) |
| | | //.SetTextColorCenter(BLACK) |
| | | .IsRestoreItem(true)//åæ¢æ¶æ¯å¦è¿åï¼è®¾ç½®é»è®¤éä¸ç¬¬ä¸é¡¹ã |
| | | .IsCenterLabel(false) //æ¯å¦åªæ¾ç¤ºä¸é´éä¸é¡¹çlabelæåï¼false忝项itemå
¨é¨é½å¸¦ælabelã |
| | | //.SetLabels("ç", "å¸", "åº") |
| | | .SetOutSideColor(0x00000000) //设置å¤é¨é®ç½©é¢è² |
| | | .Build(); |
| | | |
| | | mOptionsPickerBuilder.SetPicker(mList); |
| | | mOptionsPickerBuilder.Show(); |
| | | |
| | | |
| | | } |
| | | |
| | | |
| | | |
| | | private static string SPLIT_FLAG = ">-<"; |
| | | |
| | | /// <summary> |
| | | /// äºçº§èå¨å¼¹çª æ¯æè®¾ç½®é»è®¤éä¸ç´¢å¼ï¼èªå®ä¹æ é¢ï¼ç¡®è®¤æé®ï¼åæ¶æé®å符 |
| | | /// </summary> |
| | | public static void ShowSecondary(List<string> mFirstList, List<List<string>> mSecondList, Action<int, int> action, int mSelectIndex1 = 0, int mSelectIndex2 = 0, string title = "", string sure = "确认", string cancel = "åæ¶") |
| | | { |
| | | if (mFirstList == null) |
| | | { |
| | | return; |
| | | } |
| | | |
| | | if (mFirstList.Count != mSecondList.Count) |
| | | { |
| | | |
| | | return; |
| | | } |
| | | |
| | | var mSpliceList = new List<string>();//æ¼æ¥åçæ°ç» |
| | | for (int i = 0; i < mSecondList.Count; i++) |
| | | { |
| | | string mDataStr = ""; |
| | | for (int j = 0; j < mSecondList[i].Count; j++) |
| | | { |
| | | mDataStr += mSecondList[i][j] + SPLIT_FLAG; |
| | | } |
| | | mSpliceList.Add(mDataStr); |
| | | |
| | | } |
| | | |
| | | var mOptionsPickerBuilder = new OptionsPickerBuilder(Application.Activity, new OnSecondaryOptionsSelectListenerCallBack(action)) |
| | | .SetTitleText(title) |
| | | .SetSubmitText(sure) |
| | | .SetCancelText(cancel) |
| | | .SetContentTextSize(20)//设置æ»è½®æåå¤§å° |
| | | .SetSelectOptions(mSelectIndex1, mSelectIndex2) |
| | | //.SetDividerColor(BLACK)//设置åå²çº¿çé¢è² |
| | | //.SetSelectOptions(0, 1)//é»è®¤éä¸é¡¹ |
| | | //.SetBgColor(BLACK) |
| | | //.SetTitleBgColor(BLACK) |
| | | //.SetTitleColor(BLACK) |
| | | //.SetCancelColor(BLACK) |
| | | //.SetSubmitColor(BLACK) |
| | | //.SetTextColorCenter(BLACK) |
| | | .IsRestoreItem(true)//åæ¢æ¶æ¯å¦è¿åï¼è®¾ç½®é»è®¤éä¸ç¬¬ä¸é¡¹ã |
| | | .IsCenterLabel(false) //æ¯å¦åªæ¾ç¤ºä¸é´éä¸é¡¹çlabelæåï¼false忝项itemå
¨é¨é½å¸¦ælabelã |
| | | //.SetLabels("ç", "å¸", "åº") |
| | | .SetOutSideColor(0x00000000) //设置å¤é¨é®ç½©é¢è² |
| | | .Build(); |
| | | |
| | | |
| | | mOptionsPickerBuilder.SetPickerString(mFirstList, mSpliceList); |
| | | mOptionsPickerBuilder.Show(); |
| | | } |
| | | |
| | | |
| | | |
| | | /// <summary> |
| | | /// ä¸è卿¯æèªå®ä¹æ é¢ï¼ç¡®è®¤æé®ï¼åæ¶æé®æå |
| | | /// </summary> |
| | | public static void ShowNormal(List<string> mFirstList, List<string> mSecondList, List<string> mThirdList, Action<int, int, int> action, int mSelectIndex1 = 0, int mSelectIndex2 = 0, int mSelectIndex3 = 0, string title = "", string sure = "确认", string cancel = "åæ¶") |
| | | { |
| | | if (mFirstList == null) |
| | | { |
| | | return; |
| | | } |
| | | |
| | | if (mSecondList == null) |
| | | { |
| | | return; |
| | | } |
| | | |
| | | |
| | | |
| | | |
| | | var mOptionsPickerBuilder = new OptionsPickerBuilder(Application.Activity, new OnOptionsSelectListenerCallBack3(action)) |
| | | .SetTitleText(title) |
| | | .SetSubmitText(sure) |
| | | .SetCancelText(cancel) |
| | | .SetContentTextSize(20)//设置æ»è½®æåå¤§å° |
| | | .SetSelectOptions(mSelectIndex1, mSelectIndex2, mSelectIndex3) |
| | | //.SetDividerColor(BLACK)//设置åå²çº¿çé¢è² |
| | | //.SetSelectOptions(0, 1)//é»è®¤éä¸é¡¹ |
| | | //.SetBgColor(BLACK) |
| | | //.SetTitleBgColor(BLACK) |
| | | //.SetTitleColor(BLACK) |
| | | //.SetCancelColor(BLACK) |
| | | //.SetSubmitColor(BLACK) |
| | | //.SetTextColorCenter(BLACK) |
| | | .IsRestoreItem(true)//åæ¢æ¶æ¯å¦è¿åï¼è®¾ç½®é»è®¤éä¸ç¬¬ä¸é¡¹ã |
| | | .IsCenterLabel(false) //æ¯å¦åªæ¾ç¤ºä¸é´éä¸é¡¹çlabelæåï¼false忝项itemå
¨é¨é½å¸¦ælabelã |
| | | //.SetLabels("ç", "å¸", "åº") |
| | | .SetOutSideColor(0x00000000) //设置å¤é¨é®ç½©é¢è² |
| | | .Build(); |
| | | |
| | | |
| | | mOptionsPickerBuilder.SetNPicker(mFirstList, mSecondList, mThirdList); |
| | | mOptionsPickerBuilder.Show(); |
| | | |
| | | |
| | | |
| | | } |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | /// <summary> |
| | | /// ä¸çº§åè°äºä»¶ |
| | | /// </summary> |
| | | public class OnOptionsSelectListenerCallBack : Java.Lang.Object, IOnOptionsSelectListener |
| | | { |
| | | |
| | | Action<int> mAction; |
| | | |
| | | public OnOptionsSelectListenerCallBack(Action<int> action) |
| | | { |
| | | mAction = action; |
| | | } |
| | | |
| | | public void OnOptionsSelect(int selectIndex1, int selectIndex2, int selectIndex3, Android.Views.View p3) |
| | | { |
| | | //System.Console.WriteLine("OnOptionsSelect: selectIndex1ï¼" + selectIndex1 + " selectIndex2:" + selectIndex2); |
| | | mAction?.Invoke(selectIndex1); |
| | | } |
| | | } |
| | | |
| | | |
| | | /// <summary> |
| | | /// äºçº§èå¨åè°äºä»¶ |
| | | /// </summary> |
| | | public class OnSecondaryOptionsSelectListenerCallBack : Java.Lang.Object, IOnOptionsSelectListener |
| | | { |
| | | |
| | | |
| | | Action<int, int> mActionSecondary; |
| | | public OnSecondaryOptionsSelectListenerCallBack(Action<int, int> action) |
| | | { |
| | | mActionSecondary = action; |
| | | } |
| | | |
| | | public void OnOptionsSelect(int selectIndex1, int selectIndex2, int selectIndex3, Android.Views.View p3) |
| | | { |
| | | //System.Console.WriteLine("OnOptionsSelect: selectIndex1ï¼" + selectIndex1 + " selectIndex2:" + selectIndex2); |
| | | mActionSecondary?.Invoke(selectIndex1, selectIndex2); |
| | | } |
| | | } |
| | | |
| | | |
| | | |
| | | /// <summary> |
| | | /// ä¸çº§åè°äºä»¶ |
| | | /// </summary> |
| | | public class OnOptionsSelectListenerCallBack3 : Java.Lang.Object, IOnOptionsSelectListener |
| | | { |
| | | |
| | | Action<int, int , int> mAction; |
| | | |
| | | public OnOptionsSelectListenerCallBack3(Action<int, int, int> action) |
| | | { |
| | | mAction = action; |
| | | } |
| | | |
| | | public void OnOptionsSelect(int selectIndex1, int selectIndex2, int selectIndex3, Android.Views.View p3) |
| | | { |
| | | //System.Console.WriteLine("OnOptionsSelect: selectIndex1ï¼" + selectIndex1 + " selectIndex2:" + selectIndex2); |
| | | mAction?.Invoke(selectIndex1, selectIndex2, selectIndex3); |
| | | } |
| | | } |
| | | } |
| | | |
| | | } |
| | | |
| | | |
| | | |
New file |
| | |
| | | using System; |
| | | using System.Drawing; |
| | | using System.IO; |
| | | |
| | | |
| | | //namespace Shared |
| | | //{ |
| | | // public static class QRCode |
| | | // { |
| | | // static ZXing.Mobile.MobileBarcodeScanner scanner; |
| | | // public static void ScanQRcode(Action<string> action) |
| | | // { |
| | | // ((BaseActivity)Shared.Application.Activity).SetCamera(async (obj) => { |
| | | // if (obj) |
| | | // { |
| | | // if (scanner == null) |
| | | // { |
| | | // MobileBarcodeScanner.Initialize(Shared.Application.Activity.Application); |
| | | // scanner = new ZXing.Mobile.MobileBarcodeScanner(); |
| | | // } |
| | | |
| | | // var result = await scanner.Scan(); |
| | | |
| | | // if (result != null) |
| | | // action?.Invoke(result.Text); |
| | | // else |
| | | // action?.Invoke(null); |
| | | |
| | | // } |
| | | // else { |
| | | // action?.Invoke(null); |
| | | // } |
| | | // }); |
| | | |
| | | |
| | | // } |
| | | |
| | | // public static byte[] BytesFromText(string text, int width = 300, int height = 300) |
| | | // { |
| | | // var barcodeWriter = new ZXing.Mobile.BarcodeWriter |
| | | // { |
| | | // Format = ZXing.BarcodeFormat.QR_CODE, |
| | | // Options = new ZXing.Common.EncodingOptions |
| | | // { |
| | | // Width = width, |
| | | // Height = height, |
| | | // Margin = 10 |
| | | // } |
| | | // }; |
| | | |
| | | // barcodeWriter.Renderer = new ZXing.Mobile.BitmapRenderer();
|
| | | // var bitmap = barcodeWriter.Write(text);
|
| | | // using (var stream = new MemoryStream()) |
| | | // { |
| | | // bitmap.Compress(Android.Graphics.Bitmap.CompressFormat.Png, 100, stream); // this is the diff between iOS and Android |
| | | // stream.Position = 0; |
| | | // return stream.ToArray(); |
| | | // } |
| | | // } |
| | | // } |
| | | //} |
New file |
| | |
| | | using System; |
| | | using Android.Content; |
| | | using Android.Views; |
| | | using Android.Util; |
| | | using Android.Runtime; |
| | | using Android.Widget; |
| | | using Android.OS; |
| | | using Android.Views.Animations; |
| | | |
| | | namespace Shared |
| | | { |
| | | //å·²ç»å
¨é¢æ£æ¥äºä»£ç |
| | | /// <summary> |
| | | /// 卿»å¨äºä»¶ä¸ï¼å¯æ¾ç¤ºéèäºèªå®ä¹è§å¾ |
| | | /// </summary> |
| | | public class RowLayout : ViewGroup |
| | | { |
| | | AndroidRowLayout androidRowLayout; |
| | | |
| | | uint lineColor = 0x62818181; |
| | | /// <summary> |
| | | /// èæ¯é¢è² |
| | | /// </summary> |
| | | /// <value>The color of the background.</value> |
| | | public virtual uint LineColor |
| | | { |
| | | get |
| | | { |
| | | return lineColor; |
| | | } |
| | | set |
| | | { |
| | | lineColor = value; |
| | | byte r, g, b, a; |
| | | r = (byte)(lineColor / 256 / 256 % 256); |
| | | g = (byte)(lineColor / 256 % 256); |
| | | b = (byte)(lineColor % 256); |
| | | a = (byte)(lineColor / 256 / 256 / 256 % 256); |
| | | lineLinearLayout.SetBackgroundColor(Android.Graphics.Color.Argb(a, r, g, b)); |
| | | } |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 宽度设置æè¯»å |
| | | /// </summary> |
| | | /// <value>The width.</value> |
| | | public override int Width |
| | | { |
| | | get |
| | | { |
| | | return base.Width; |
| | | } |
| | | set |
| | | { |
| | | base.Width = value; |
| | | if (!IsCanRefresh) |
| | | { |
| | | return; |
| | | } |
| | | var layoutParameters = androidRowLayout.LayoutParameters; |
| | | layoutParameters.Width = Width; |
| | | androidRowLayout.LayoutParameters = layoutParameters; |
| | | } |
| | | } |
| | | |
| | | /// <summary> |
| | | /// è§å¾é«åº¦ |
| | | /// </summary> |
| | | /// <value>The height.</value> |
| | | public override int Height |
| | | { |
| | | get |
| | | { |
| | | return base.Height; |
| | | } |
| | | set |
| | | { |
| | | base.Height = value; |
| | | if (!IsCanRefresh) |
| | | { |
| | | return; |
| | | } |
| | | var layoutParameters = androidRowLayout.LayoutParameters; |
| | | layoutParameters.Height = Height; |
| | | androidRowLayout.LayoutParameters = layoutParameters; |
| | | } |
| | | } |
| | | |
| | | Android.Widget.LinearLayout leftLinarLayout; |
| | | Android.Widget.LinearLayout rightLinarLayout; |
| | | Android.Widget.LinearLayout lineLinearLayout; |
| | | /// <summary> |
| | | /// 卿»å¨äºä»¶ä¸ï¼å¯æ¾ç¤ºéèäºèªå®ä¹è§å¾ |
| | | /// </summary> |
| | | public RowLayout() |
| | | { |
| | | viewGroup = new Android.Widget.FrameLayout(Application.Activity); |
| | | androidRowLayout = new AndroidRowLayout(Application.Activity, this) { }; |
| | | androidRowLayout.RightToLeftAction += () => |
| | | { |
| | | openRightMenu(); |
| | | }; |
| | | androidRowLayout.LeftToRightAction += () => |
| | | { |
| | | openLeftMenu(); |
| | | }; |
| | | realViewGroup = androidRowLayout; |
| | | leftLinarLayout = new Android.Widget.LinearLayout(Application.Activity) { Orientation = Android.Widget.Orientation.Horizontal, Alpha = 0.0f }; |
| | | rightLinarLayout = new Android.Widget.LinearLayout(Application.Activity) { Orientation = Android.Widget.Orientation.Horizontal, Alpha = 0.0f }; |
| | | lineLinearLayout = new Android.Widget.LinearLayout(Application.Activity); |
| | | LineColor = lineColor; |
| | | |
| | | viewGroup.AddView(leftLinarLayout, new Android.Views.ViewGroup.LayoutParams(Android.Views.ViewGroup.LayoutParams.WrapContent, Android.Views.ViewGroup.LayoutParams.MatchParent)); |
| | | viewGroup.AddView(rightLinarLayout, new Android.Views.ViewGroup.LayoutParams(Android.Views.ViewGroup.LayoutParams.WrapContent, Android.Views.ViewGroup.LayoutParams.MatchParent)); |
| | | viewGroup.AddView(androidRowLayout, new Android.Views.ViewGroup.LayoutParams(Android.Views.ViewGroup.LayoutParams.MatchParent, Android.Views.ViewGroup.LayoutParams.MatchParent)); |
| | | viewGroup.AddView(lineLinearLayout, new Android.Widget.FrameLayout.LayoutParams(Android.Views.ViewGroup.LayoutParams.MatchParent, DensityUtil.Dip2Px(1), Android.Views.GravityFlags.Bottom)); |
| | | |
| | | |
| | | } |
| | | |
| | | |
| | | |
| | | void openLeftMenu() |
| | | { |
| | | if (androidRowLayout.isShowRight) |
| | | { |
| | | hideRightMenu(); |
| | | return; |
| | | } |
| | | |
| | | if (leftLinarLayout.ChildCount == 0) |
| | | return; |
| | | |
| | | androidRowLayout.isShowLeft = true; |
| | | |
| | | Android.Widget.FrameLayout.LayoutParams lp = (Android.Widget.FrameLayout.LayoutParams)androidRowLayout.LayoutParameters; |
| | | lp.LeftMargin = leftLinarLayout.LayoutParameters.Width; |
| | | androidRowLayout.LayoutParameters = lp; |
| | | leftLinarLayout.Alpha = 1.0f; |
| | | |
| | | |
| | | if (leftLinarLayout.Animation == null) |
| | | { |
| | | leftLinarLayout.Animation = new TranslateAnimation( |
| | | Dimension.RelativeToSelf, 0.1f, |
| | | Dimension.RelativeToSelf, 0, |
| | | Dimension.RelativeToSelf, 0, |
| | | Dimension.RelativeToSelf, 0); |
| | | leftLinarLayout.Animation.Duration = 200; |
| | | } |
| | | |
| | | // Animation = leftUIView.Animation; |
| | | //Animation.Reset(); |
| | | //Animation.StartNow(); |
| | | |
| | | leftLinarLayout.Animation.Reset(); |
| | | leftLinarLayout.Animation.StartNow(); |
| | | |
| | | |
| | | // UIView.Animate (0.2f, 0.0f, UIViewAnimationOptions.BeginFromCurrentState, () => { |
| | | // contentView.X = (int)leftUIView.Frame.Width; |
| | | // leftUIView.Alpha = 1.0f; |
| | | // }, () => { |
| | | // |
| | | // }); |
| | | } |
| | | |
| | | void hideLeftMenu() |
| | | { |
| | | androidRowLayout.isShowLeft = false; |
| | | Android.Widget.FrameLayout.LayoutParams lp = (Android.Widget.FrameLayout.LayoutParams)androidRowLayout.LayoutParameters; |
| | | lp.LeftMargin = 0; |
| | | androidRowLayout.LayoutParameters = lp; |
| | | leftLinarLayout.Alpha = 0.0f; |
| | | // UIView.Animate(0.2f,0.0f,UIViewAnimationOptions.BeginFromCurrentState,()=>{ |
| | | // contentView.X=0; |
| | | // leftUIView.Alpha=0.0f; |
| | | // },()=>{ |
| | | // |
| | | // }); |
| | | } |
| | | |
| | | void openRightMenu() |
| | | { |
| | | if (androidRowLayout.isShowLeft) |
| | | { |
| | | hideLeftMenu(); |
| | | return; |
| | | } |
| | | if (rightLinarLayout.ChildCount == 0) |
| | | return; |
| | | |
| | | androidRowLayout.isShowRight = true; |
| | | Android.Widget.FrameLayout.LayoutParams lp = (Android.Widget.FrameLayout.LayoutParams)androidRowLayout.LayoutParameters; |
| | | lp.LeftMargin = -rightLinarLayout.LayoutParameters.Width; |
| | | androidRowLayout.LayoutParameters = lp; |
| | | |
| | | rightLinarLayout.Alpha = 1.0f; |
| | | |
| | | if (rightLinarLayout.Animation == null) |
| | | { |
| | | rightLinarLayout.Animation = new TranslateAnimation( |
| | | Dimension.RelativeToSelf, -0.1f, |
| | | Dimension.RelativeToSelf, 0.0f, |
| | | Dimension.RelativeToSelf, 0, |
| | | Dimension.RelativeToSelf, 0); |
| | | rightLinarLayout.Animation.Duration = 200; |
| | | } |
| | | |
| | | //Animation = rightUIView.Animation; |
| | | //Animation.Reset(); |
| | | //Animation.StartNow(); |
| | | |
| | | rightLinarLayout.Animation.Reset(); |
| | | rightLinarLayout.Animation.StartNow(); |
| | | } |
| | | |
| | | void hideRightMenu() |
| | | { |
| | | androidRowLayout.isShowRight = false; |
| | | Android.Widget.FrameLayout.LayoutParams lp = (Android.Widget.FrameLayout.LayoutParams)androidRowLayout.LayoutParameters; |
| | | lp.LeftMargin = 0; |
| | | androidRowLayout.LayoutParameters = lp; |
| | | |
| | | rightLinarLayout.Alpha = 0.0f; |
| | | } |
| | | |
| | | /// <summary> |
| | | /// åè§å¾ç宽度 |
| | | /// </summary> |
| | | int subViewWidth = 100; |
| | | |
| | | /// <summary> |
| | | /// å¢å 左边è§å¾ |
| | | /// </summary> |
| | | /// <param name="view">View.</param> |
| | | public void AddLeftView(View view) |
| | | { |
| | | leftLinarLayout.AddView(view.AndroidView, new Android.Views.ViewGroup.LayoutParams(DensityUtil.Dip2Px(subViewWidth), androidRowLayout.LayoutParameters.Height)); |
| | | leftLinarLayout.LayoutParameters.Width = leftLinarLayout.ChildCount * DensityUtil.Dip2Px(subViewWidth); |
| | | view.Parent = this; |
| | | view.Width = DensityUtil.Dip2Px(subViewWidth); |
| | | view.Height = androidRowLayout.LayoutParameters.Height; |
| | | } |
| | | |
| | | |
| | | /// <summary> |
| | | /// å¢å å³è¾¹è§å¾ |
| | | /// </summary> |
| | | /// <param name="view">View.</param> |
| | | public void AddRightView(View view) |
| | | { |
| | | rightLinarLayout.AddView(view.AndroidView, new Android.Views.ViewGroup.LayoutParams(DensityUtil.Dip2Px(subViewWidth), androidRowLayout.LayoutParameters.Height)); |
| | | rightLinarLayout.LayoutParameters.Width = rightLinarLayout.ChildCount * DensityUtil.Dip2Px(subViewWidth); |
| | | ((Android.Widget.FrameLayout.LayoutParams)rightLinarLayout.LayoutParameters).LeftMargin = androidRowLayout.LayoutParameters.Width - rightLinarLayout.LayoutParameters.Width; |
| | | view.Parent = this; |
| | | view.Width = DensityUtil.Dip2Px(subViewWidth); |
| | | view.Height = androidRowLayout.LayoutParameters.Height; |
| | | } |
| | | |
| | | |
| | | |
| | | class AndroidRowLayout : Android.Widget.FrameLayout |
| | | { |
| | | View _view; |
| | | int mTouchSlop |
| | | { |
| | | get |
| | | { |
| | | var configuration = ViewConfiguration.Get(Context); |
| | | //æå°çæ»å¨è·ç¦» |
| | | return configuration.ScaledTouchSlop; |
| | | } |
| | | } |
| | | public AndroidRowLayout(Context context, View view) |
| | | : base(context) |
| | | { |
| | | _view = view; |
| | | } |
| | | |
| | | float mLastX, mLastY; |
| | | internal bool isShowLeft; |
| | | internal bool isShowRight; |
| | | public Action RightToLeftAction; |
| | | public Action LeftToRightAction; |
| | | bool isActioned; |
| | | bool action(MotionEvent e) |
| | | { |
| | | switch (e.Action) |
| | | { |
| | | case MotionEventActions.Down: |
| | | //è®°å½ç¹å»çææ°Xåæ |
| | | mLastX = e.RawX; |
| | | mLastY = e.RawY; |
| | | Parent?.RequestDisallowInterceptTouchEvent(true); |
| | | break; |
| | | case MotionEventActions.Move: |
| | | var x = e.RawX; |
| | | var y = e.RawY; |
| | | var deltaX = x - mLastX; |
| | | var deltaY = y - mLastY; |
| | | if (Math.Abs(deltaY) < Math.Abs(deltaX)) |
| | | { |
| | | if (!isActioned) |
| | | { |
| | | //RightToLeftAction |
| | | if (deltaX < -mTouchSlop) |
| | | { |
| | | isActioned = true; |
| | | //parentDelay(true); |
| | | //System.Console.WriteLine("RowLayout:DispatchTouchEvent:RightToLeft"); |
| | | RightToLeftAction?.Invoke(); |
| | | } |
| | | //LeftToRightAction |
| | | if (mTouchSlop < deltaX) |
| | | { |
| | | isActioned = true; |
| | | //parentDelay(true); |
| | | //System.Console.WriteLine("RowLayout:DispatchTouchEvent:LeftToRight"); |
| | | LeftToRightAction?.Invoke(); |
| | | } |
| | | } |
| | | return true; |
| | | } |
| | | else |
| | | { |
| | | //ä¸ä¸æ»å¨æ¶ï¼å
è®¸ç¶æ§ä»¶çæ¦æª |
| | | if (4 < Math.Abs(deltaY)) |
| | | { |
| | | Parent?.RequestDisallowInterceptTouchEvent(false); |
| | | } |
| | | } |
| | | break; |
| | | } |
| | | return false; |
| | | } |
| | | |
| | | /// <summary> |
| | | /// æ§è¡OnInterceptTouchEventåOnTouchEvent |
| | | /// </summary> |
| | | /// <returns><c>true</c>äºä»¶å·²ç»å¤ç<c>false</c>äºä»¶æ²¡æå¤ç</returns> |
| | | /// <param name="e">E.</param> |
| | | public override bool DispatchTouchEvent(MotionEvent e) |
| | | { |
| | | System.Console.WriteLine($"{GetType()} Height->{Height} Width->{Width} DispatchTouchEvent->{e.Action}"); |
| | | if (e.Action == MotionEventActions.Down) |
| | | { |
| | | isActioned = false; |
| | | //è¿åå
è®¸æ¦æªäºä»¶ |
| | | RequestDisallowInterceptTouchEvent(false); |
| | | } |
| | | return base.DispatchTouchEvent(e); |
| | | } |
| | | |
| | | public override bool OnInterceptTouchEvent(MotionEvent e) |
| | | { |
| | | System.Console.WriteLine($"{GetType()} Height->{Height} Width->{Width} OnInterceptTouchEvent->{e.Action}"); |
| | | if (disallowIntercept) |
| | | { |
| | | return false; |
| | | } |
| | | if (action(e)) |
| | | { |
| | | return true; |
| | | } |
| | | return base.OnInterceptTouchEvent(e); |
| | | } |
| | | |
| | | /// <summary> |
| | | /// éåç¹å»äºä»¶ |
| | | /// </summary> |
| | | /// <returns><c>true</c>, if touch event was oned, <c>false</c> otherwise.</returns> |
| | | /// <param name="e">E.</param> |
| | | public override bool OnTouchEvent(MotionEvent e) |
| | | { |
| | | System.Console.WriteLine($"{GetType()} Height->{Height} Width->{Width} OnTouchEvent->{e.Action}"); |
| | | if (!isActioned) |
| | | { |
| | | _view.TouchEvent(e); |
| | | } |
| | | action(e); |
| | | return true; |
| | | } |
| | | bool disallowIntercept; |
| | | public override void RequestDisallowInterceptTouchEvent(bool disallowIntercept) |
| | | { |
| | | this.disallowIntercept = disallowIntercept; |
| | | System.Console.WriteLine($"{GetType()} Height->{Height} RequestDisallowInterceptTouchEvent->{disallowIntercept}"); |
| | | base.RequestDisallowInterceptTouchEvent(disallowIntercept); |
| | | Parent?.RequestDisallowInterceptTouchEvent(disallowIntercept); |
| | | } |
| | | } |
| | | } |
| | | } |
| | | |
| | | |
| | | |
New file |
| | |
| | | using System; |
| | | using System.Collections.Generic; |
| | | using System.Linq; |
| | | using System.Text; |
| | | using Android.App; |
| | | using Android.Content; |
| | | using Android.OS; |
| | | using Android.Runtime; |
| | | using Android.Views; |
| | | using Android.Widget; |
| | | using Android.Util; |
| | | using Android.Views.Animations; |
| | | |
| | | namespace Shared |
| | | { |
| | | /// <summary> |
| | | /// å½åè§å¾ |
| | | /// </summary> |
| | | public class Spinner : Button |
| | | { |
| | | public Spinner() |
| | | { |
| | | TextColor = 0xff007aff; |
| | | Radius = 10; |
| | | BorderWidth = (uint)DensityUtil.Dip2Px(1); |
| | | MouseUpEventHandler += (sender, e) => |
| | | { |
| | | if (AdapterStr == null || AdapterStr.Length == 0) |
| | | { |
| | | return; |
| | | } |
| | | ScrollView tempScrolView = new ScrollView(Application.Activity); |
| | | tempScrolView.VerticalScrollBarEnabled = false; |
| | | Application.RootFrameLayout.AddView(tempScrolView, new Android.Views.ViewGroup.LayoutParams(Application.CurrentWidth, Application.CurrentHeight)); |
| | | tempScrolView.BringToFront(); |
| | | tempScrolView.Alpha = 0.94f; |
| | | |
| | | |
| | | Android.Widget.LinearLayout linearLayout = new Android.Widget.LinearLayout(Application.Activity); |
| | | linearLayout.Orientation = Orientation.Vertical; |
| | | tempScrolView.AddView(linearLayout, new Android.Views.ViewGroup.LayoutParams(tempScrolView.LayoutParameters.Width, Android.Views.ViewGroup.LayoutParams.WrapContent)); |
| | | |
| | | |
| | | int height = 40; |
| | | int totalHeight = AdapterStr.Length * DensityUtil.Dip2Px(height + 1); |
| | | if (totalHeight < tempScrolView.LayoutParameters.Height) |
| | | { |
| | | var ll = new Android.Widget.TextView(Application.Activity); |
| | | ll.Touch += (sender1, e1) => |
| | | { |
| | | if (e1.Event.Action == MotionEventActions.Up) |
| | | { |
| | | ((Android.Views.ViewGroup)tempScrolView.Parent).RemoveView(tempScrolView); |
| | | } |
| | | }; |
| | | linearLayout.AddView(ll, new Android.Views.ViewGroup.LayoutParams(tempScrolView.LayoutParameters.Width, tempScrolView.LayoutParameters.Height - totalHeight)); |
| | | } |
| | | Android.Widget.LinearLayout l = new Android.Widget.LinearLayout(Application.Activity); |
| | | l.Orientation = Orientation.Vertical; |
| | | linearLayout.AddView(l, new Android.Views.ViewGroup.LayoutParams(linearLayout.LayoutParameters.Width, Android.Views.ViewGroup.LayoutParams.WrapContent)); |
| | | |
| | | for (int i = 0; i < this.AdapterStr.Length; i++) |
| | | { |
| | | Android.Widget.Button button = new Android.Widget.Button(Application.Activity); |
| | | |
| | | button.Text = AdapterStr[i]; |
| | | button.SetTextColor(new Android.Graphics.Color(0x6d, 0x6d, 0x72, 0xff)); |
| | | button.SetBackgroundColor(Android.Graphics.Color.White); |
| | | button.Tag = i; |
| | | button.Click += (sender1, e1) => |
| | | { |
| | | ((Android.Views.ViewGroup)tempScrolView.Parent).RemoveView(tempScrolView); |
| | | //tempScrolView.Animation = new TranslateAnimation( |
| | | // Dimension.RelativeToSelf, 0.0f, |
| | | // Dimension.RelativeToSelf, 0.0f, |
| | | // Dimension.RelativeToSelf, 0.0f, |
| | | // Dimension.RelativeToSelf, 1.0f); |
| | | //tempScrolView.Animation.Duration = 500; |
| | | ////view.Animation.AnimationEnd += (sender, e) => |
| | | ////{ |
| | | //// ((Android.Views.ViewGroup)view.Parent).RemoveView(view); |
| | | ////}; |
| | | //tempScrolView.Animation.StartNow(); |
| | | if (SelectedItemChanged != null) |
| | | { |
| | | SelectedItemChanged(this, (int)button.Tag); |
| | | Text = AdapterStr[(int)button.Tag]; |
| | | } |
| | | }; |
| | | |
| | | l.AddView(button, new Android.Views.ViewGroup.LayoutParams(l.LayoutParameters.Width, DensityUtil.Dip2Px(height))); |
| | | |
| | | |
| | | if (i == AdapterStr.Length - 1) |
| | | { |
| | | //var gradientDrawable = new Android.Graphics.Drawables.GradientDrawable(); |
| | | //gradientDrawable.SetCornerRadius(10); |
| | | //button.Background = gradientDrawable; |
| | | } |
| | | else { |
| | | |
| | | Android.Widget.TextView line = new Android.Widget.TextView(Application.Activity); |
| | | line.SetBackgroundColor(new Android.Graphics.Color(0xdd, 0xdd, 0xdd, 0xff)); |
| | | l.AddView(line, new Android.Views.ViewGroup.LayoutParams(Android.Views.ViewGroup.LayoutParams.MatchParent, DensityUtil.Dip2Px(1))); |
| | | |
| | | if (i == 0) |
| | | { |
| | | //var gradientDrawable = new Android.Graphics.Drawables.GradientDrawable(); |
| | | //gradientDrawable.SetCornerRadius(10); |
| | | //button.Background = gradientDrawable; |
| | | } |
| | | } |
| | | } |
| | | |
| | | tempScrolView.Animation = new TranslateAnimation( |
| | | Dimension.RelativeToSelf, 0.0f, |
| | | Dimension.RelativeToSelf, 0.0f, |
| | | Dimension.RelativeToSelf, 1.0f, |
| | | Dimension.RelativeToSelf, 0.0f); |
| | | tempScrolView.Animation.Duration = 500; |
| | | |
| | | tempScrolView.Animation.StartNow(); |
| | | }; |
| | | } |
| | | |
| | | |
| | | int currentRow; |
| | | /// <summary> |
| | | /// å½åè¡ |
| | | /// </summary> |
| | | /// <value>å½åè¡ï¼ä»0å¼å§</value> |
| | | public int CurrentRow |
| | | { |
| | | get |
| | | { |
| | | return currentRow; |
| | | } |
| | | set |
| | | { |
| | | if (AdapterStr == null || value < 0 || AdapterStr.Length <= value) |
| | | { |
| | | return; |
| | | } |
| | | |
| | | currentRow = value; |
| | | Text = AdapterStr[value]; |
| | | } |
| | | } |
| | | |
| | | |
| | | /// <summary> |
| | | /// æ·»å 䏿åè¡¨çæ°æ® |
| | | /// </summary> |
| | | /// <param name="Str">String.</param> |
| | | public string[] AdapterStr |
| | | { |
| | | get; |
| | | set; |
| | | } |
| | | |
| | | /// <summary> |
| | | /// éæ©å表ååçäºä»¶ |
| | | /// </summary> |
| | | public Action<View, int> SelectedItemChanged; |
| | | |
| | | |
| | | /// <summary> |
| | | /// å·æ°å½åè§å¾ |
| | | /// </summary> |
| | | public override void Refresh() |
| | | { |
| | | base.Refresh(); |
| | | CurrentRow = 0; |
| | | } |
| | | } |
| | | } |
| | | |
| | | |
New file |
| | |
| | | using System; |
| | | using Android.Content; |
| | | using Android.Views; |
| | | using Android.Views.Animations; |
| | | |
| | | namespace Shared |
| | | { |
| | | public class SwipeLayout:ViewGroup |
| | | { |
| | | AndroidSwipeLayout androidSwipeLayout; |
| | | |
| | | uint lineColor = 0x62818181; |
| | | /// <summary> |
| | | /// èæ¯é¢è² |
| | | /// </summary> |
| | | /// <value>The color of the background.</value> |
| | | public virtual uint LineColor |
| | | { |
| | | get |
| | | { |
| | | return lineColor; |
| | | } |
| | | set |
| | | { |
| | | lineColor = value; |
| | | byte a, r, g, b; |
| | | a = (byte)(lineColor / 256 / 256 / 256 % 256); |
| | | r = (byte)(lineColor / 256 / 256 % 256); |
| | | g = (byte)(lineColor / 256 % 256); |
| | | b = (byte)(lineColor % 256); |
| | | lineLinearLayout.SetBackgroundColor(Android.Graphics.Color.Argb(a, r, g, b)); |
| | | } |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 宽度设置æè¯»å |
| | | /// </summary> |
| | | /// <value>The width.</value> |
| | | public override int Width |
| | | { |
| | | get |
| | | { |
| | | return base.Width; |
| | | } |
| | | set |
| | | { |
| | | base.Width = value; |
| | | if (!IsCanRefresh) |
| | | { |
| | | return; |
| | | } |
| | | var layoutParameters = androidSwipeLayout.LayoutParameters; |
| | | layoutParameters.Width = Width; |
| | | androidSwipeLayout.LayoutParameters = layoutParameters; |
| | | } |
| | | } |
| | | |
| | | /// <summary> |
| | | /// è§å¾é«åº¦ |
| | | /// </summary> |
| | | /// <value>The height.</value> |
| | | public override int Height |
| | | { |
| | | get |
| | | { |
| | | return base.Height; |
| | | } |
| | | set |
| | | { |
| | | base.Height = value; |
| | | if (!IsCanRefresh) |
| | | { |
| | | return; |
| | | } |
| | | var layoutParameters = androidSwipeLayout.LayoutParameters; |
| | | layoutParameters.Height = Height; |
| | | androidSwipeLayout.LayoutParameters = layoutParameters; |
| | | } |
| | | } |
| | | |
| | | Android.Widget.LinearLayout leftLinarLayout; |
| | | Android.Widget.LinearLayout rightLinarLayout; |
| | | Android.Widget.LinearLayout lineLinearLayout; |
| | | /// <summary> |
| | | /// 卿»å¨äºä»¶ä¸ï¼å¯æ¾ç¤ºéèäºèªå®ä¹è§å¾ |
| | | /// </summary> |
| | | public SwipeLayout() |
| | | { |
| | | viewGroup = new Android.Widget.FrameLayout(Application.Activity); |
| | | androidSwipeLayout = new AndroidSwipeLayout(Application.Activity, this); |
| | | realViewGroup = androidSwipeLayout; |
| | | leftLinarLayout = new Android.Widget.LinearLayout(Application.Activity) { Orientation = Android.Widget.Orientation.Horizontal, Alpha = 0.0f }; |
| | | rightLinarLayout = new Android.Widget.LinearLayout(Application.Activity) { Orientation = Android.Widget.Orientation.Horizontal, Alpha = 0.0f }; |
| | | lineLinearLayout = new Android.Widget.LinearLayout(Application.Activity); |
| | | LineColor = lineColor; |
| | | |
| | | viewGroup.AddView(leftLinarLayout, new Android.Views.ViewGroup.LayoutParams(Android.Views.ViewGroup.LayoutParams.WrapContent, Android.Views.ViewGroup.LayoutParams.MatchParent)); |
| | | viewGroup.AddView(rightLinarLayout, new Android.Views.ViewGroup.LayoutParams(Android.Views.ViewGroup.LayoutParams.WrapContent, Android.Views.ViewGroup.LayoutParams.MatchParent)); |
| | | viewGroup.AddView(androidSwipeLayout, new Android.Views.ViewGroup.LayoutParams(Android.Views.ViewGroup.LayoutParams.MatchParent, Android.Views.ViewGroup.LayoutParams.MatchParent)); |
| | | viewGroup.AddView(lineLinearLayout, new Android.Widget.FrameLayout.LayoutParams(Android.Views.ViewGroup.LayoutParams.MatchParent, DensityUtil.Dip2Px(1), Android.Views.GravityFlags.Bottom)); |
| | | |
| | | |
| | | } |
| | | |
| | | void openLeftMenu() |
| | | { |
| | | hideRightMenu(); |
| | | |
| | | if (leftLinarLayout.ChildCount == 0) |
| | | return; |
| | | |
| | | Android.Widget.FrameLayout.LayoutParams lp = (Android.Widget.FrameLayout.LayoutParams)androidSwipeLayout.LayoutParameters; |
| | | lp.LeftMargin = leftLinarLayout.LayoutParameters.Width; |
| | | androidSwipeLayout.LayoutParameters = lp; |
| | | leftLinarLayout.Alpha = 1.0f; |
| | | |
| | | leftLinarLayout.ClearAnimation(); |
| | | leftLinarLayout.Animation = new TranslateAnimation( |
| | | Dimension.RelativeToSelf, 0.1f, |
| | | Dimension.RelativeToSelf, 0, |
| | | Dimension.RelativeToSelf, 0, |
| | | Dimension.RelativeToSelf, 0); |
| | | leftLinarLayout.Animation.Duration = 200; |
| | | |
| | | leftLinarLayout.Animation.StartNow(); |
| | | } |
| | | |
| | | void hideLeftMenu() |
| | | { |
| | | Android.Widget.FrameLayout.LayoutParams lp = (Android.Widget.FrameLayout.LayoutParams)androidSwipeLayout.LayoutParameters; |
| | | lp.LeftMargin = 0; |
| | | androidSwipeLayout.LayoutParameters = lp; |
| | | leftLinarLayout.Alpha = 0.0f; |
| | | } |
| | | |
| | | void openRightMenu() |
| | | { |
| | | hideLeftMenu(); |
| | | if (rightLinarLayout.ChildCount == 0) |
| | | return; |
| | | |
| | | Android.Widget.FrameLayout.LayoutParams lp = (Android.Widget.FrameLayout.LayoutParams)androidSwipeLayout.LayoutParameters; |
| | | lp.LeftMargin = -rightLinarLayout.LayoutParameters.Width; |
| | | androidSwipeLayout.LayoutParameters = lp; |
| | | |
| | | rightLinarLayout.Alpha = 1.0f; |
| | | |
| | | if (rightLinarLayout.Animation == null) |
| | | { |
| | | rightLinarLayout.Animation = new TranslateAnimation( |
| | | Dimension.RelativeToSelf, -0.1f, |
| | | Dimension.RelativeToSelf, 0.0f, |
| | | Dimension.RelativeToSelf, 0, |
| | | Dimension.RelativeToSelf, 0); |
| | | rightLinarLayout.Animation.Duration = 200; |
| | | } |
| | | |
| | | rightLinarLayout.Animation.Reset(); |
| | | rightLinarLayout.Animation.StartNow(); |
| | | } |
| | | |
| | | void hideRightMenu() |
| | | { |
| | | Android.Widget.FrameLayout.LayoutParams lp = (Android.Widget.FrameLayout.LayoutParams)androidSwipeLayout.LayoutParameters; |
| | | lp.LeftMargin = 0; |
| | | androidSwipeLayout.LayoutParameters = lp; |
| | | |
| | | rightLinarLayout.Alpha = 0.0f; |
| | | } |
| | | |
| | | /// <summary> |
| | | /// åè§å¾ç宽度 |
| | | /// </summary> |
| | | int subViewWidth = 100; |
| | | |
| | | /// <summary> |
| | | /// å¢å 左边è§å¾ |
| | | /// </summary> |
| | | /// <param name="view">View.</param> |
| | | public void AddLeftView(View view) |
| | | { |
| | | leftLinarLayout.AddView(view.AndroidView, new Android.Views.ViewGroup.LayoutParams(DensityUtil.Dip2Px(subViewWidth), androidSwipeLayout.LayoutParameters.Height)); |
| | | leftLinarLayout.LayoutParameters.Width = leftLinarLayout.ChildCount * DensityUtil.Dip2Px(subViewWidth); |
| | | view.Parent = this; |
| | | view.Width = DensityUtil.Dip2Px(subViewWidth); |
| | | view.Height = androidSwipeLayout.LayoutParameters.Height; |
| | | } |
| | | |
| | | /// <summary> |
| | | /// å¢å å³è¾¹è§å¾ |
| | | /// </summary> |
| | | /// <param name="view">View.</param> |
| | | public void AddRightView(View view) |
| | | { |
| | | rightLinarLayout.AddView(view.AndroidView, new Android.Views.ViewGroup.LayoutParams(DensityUtil.Dip2Px(subViewWidth), androidSwipeLayout.LayoutParameters.Height)); |
| | | rightLinarLayout.LayoutParameters.Width = rightLinarLayout.ChildCount * DensityUtil.Dip2Px(subViewWidth); |
| | | ((Android.Widget.FrameLayout.LayoutParams)rightLinarLayout.LayoutParameters).LeftMargin = androidSwipeLayout.LayoutParameters.Width - rightLinarLayout.LayoutParameters.Width; |
| | | view.Parent = this; |
| | | view.Width = DensityUtil.Dip2Px(subViewWidth); |
| | | view.Height = androidSwipeLayout.LayoutParameters.Height; |
| | | } |
| | | |
| | | internal class AndroidSwipeLayout : Android.Widget.FrameLayout, GestureDetector.IOnGestureListener |
| | | { |
| | | /// <summary> |
| | | /// 左峿»å¨çæçè·ç¦» |
| | | /// </summary> |
| | | int distance = 100; |
| | | /// <summary> |
| | | /// 左峿»å¨çæå°é度 |
| | | /// </summary> |
| | | int velocity = 200; |
| | | |
| | | bool isFling; |
| | | /// <summary> |
| | | /// æå¿å¯¹è±¡ |
| | | /// </summary> |
| | | GestureDetector mGesture; |
| | | SwipeLayout swipeLayout; |
| | | public AndroidSwipeLayout(Context context, SwipeLayout swipeLayout) |
| | | : base(context) |
| | | { |
| | | this.swipeLayout = swipeLayout; |
| | | mGesture = new GestureDetector(context, this); |
| | | } |
| | | |
| | | |
| | | |
| | | public override bool OnTouchEvent(MotionEvent e) |
| | | { |
| | | if (Shared.AndroidView.IsLive(this) && !isFling) |
| | | swipeLayout.TouchEvent(e); |
| | | return true; |
| | | } |
| | | |
| | | public override bool OnInterceptTouchEvent(MotionEvent ev) |
| | | { |
| | | if (!Shared.AndroidView.IsLive(this)) |
| | | { |
| | | return false; |
| | | } |
| | | mGesture.OnTouchEvent(ev); |
| | | //å¦ææ¯æ»å¨ï¼å°±æ¦æªäºä»¶ï¼åé¢çäºä»¶æ¯ç±èªå·±çTouchEventå¤çï¼åæ§ä»¶ä¼æ¶å°åæ¶äºä»¶ï¼å¦ææ¯å¿«éæ»å¨ï¼äºä»¶ä¹æ¯èªå·±å¤ç |
| | | if (isFling) |
| | | { |
| | | return true; |
| | | } |
| | | //å¦ææ¯æ»å¨è¿éä¹ä¼è¿åTrue |
| | | return base.OnInterceptTouchEvent(ev); |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 设置ææç¶è§å¾ç¦æ¢æ¦æªäºä»¶ |
| | | /// </summary> |
| | | /// <param name="b">å¦æè®¾ç½®True表示ä¸è¦æ¦æªï¼å¦æè®¾ç½®ä¸ºFalse表示å¯ä»¥æ¦æª</param> |
| | | void requestParentDisallowInterceptTouchEvent(bool b) |
| | | { |
| | | var tempParent = Parent; |
| | | while (tempParent != null) |
| | | { //åè¯ç¶ç±»ä¸è¦æ¦æªè¿ä¸ªè§å¾çäºä»¶ |
| | | tempParent.RequestDisallowInterceptTouchEvent(b); |
| | | tempParent = tempParent.Parent; |
| | | } |
| | | } |
| | | |
| | | public bool OnDown(MotionEvent e) |
| | | { |
| | | isFling = false; |
| | | return false; |
| | | } |
| | | |
| | | public bool OnFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) |
| | | { |
| | | // e1ï¼ç¬¬1个ACTION_DOWN MotionEvent |
| | | // e2ï¼æåä¸ä¸ªACTION_MOVE MotionEvent |
| | | // velocityXï¼Xè½´ä¸çç§»å¨é度ï¼åç´ /ç§ï¼ |
| | | // velocityYï¼Yè½´ä¸çç§»å¨é度ï¼åç´ /ç§ï¼ |
| | | // åå·¦æ» |
| | | if (e1.GetX() - e2.GetX() > distance |
| | | && Math.Abs(velocityX) > velocity) |
| | | { |
| | | isFling = true; |
| | | swipeLayout.openRightMenu(); |
| | | } |
| | | // å峿» |
| | | if (e2.GetX() - e1.GetX() > distance |
| | | && Math.Abs(velocityX) > velocity) |
| | | { |
| | | isFling = true; |
| | | swipeLayout.openLeftMenu(); |
| | | } |
| | | //è¿
éæ»å¨ï¼å¹¶æ¾å¼ |
| | | return false; |
| | | } |
| | | |
| | | public void OnLongPress(MotionEvent e) |
| | | { |
| | | Console.WriteLine("OnLongPress:é¿æä¸æ¾"); |
| | | } |
| | | |
| | | public bool OnScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) |
| | | { |
| | | Console.WriteLine("OnScroll:å¨å±å¹ä¸æ»å¨"); |
| | | return false; |
| | | } |
| | | |
| | | public void OnShowPress(MotionEvent e) |
| | | { |
| | | Console.WriteLine("OnShowPress:æææä¸ä¸æ®µæ¶é´ï¼è¿æ²¡å°é¿æ"); |
| | | } |
| | | |
| | | public bool OnSingleTapUp(MotionEvent e) |
| | | { |
| | | if(!isFling){ |
| | | swipeLayout.hideLeftMenu(); |
| | | swipeLayout.hideRightMenu(); |
| | | } |
| | | Console.WriteLine("OnSingleTapUp:ææå¼¹èµ·"); |
| | | return false; |
| | | } |
| | | } |
| | | } |
| | | } |
New file |
| | |
| | | |
| | | 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); |
| | | } |
| | | } |
| | | } |
| | | } |
New file |
| | |
| | | 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));
|
| | | }
|
| | | }
|
| | | }
|
| | | }
|
| | |
|
| | | }
|
| | | } |
New file |
| | |
| | | using System; |
| | | using Android.Views; |
| | | using Android.Widget; |
| | | |
| | | namespace Shared |
| | | { |
| | | public class Tip |
| | | { |
| | | public Tip() |
| | | { |
| | | this.BackgroundColor = 0xff323232; |
| | | this.CloseTime = 2; |
| | | this.MaxWidth = 100; |
| | | } |
| | | public int CloseTime { |
| | | get; |
| | | set; |
| | | } |
| | | |
| | | public string Text { |
| | | get; |
| | | set; |
| | | } |
| | | |
| | | public AMPopTipDirection Direction { |
| | | get; |
| | | set; |
| | | } |
| | | |
| | | public int MaxWidth { |
| | | get; |
| | | set; |
| | | } |
| | | |
| | | public uint BackgroundColor { |
| | | get; |
| | | set; |
| | | } |
| | | |
| | | |
| | | /// <summary> |
| | | /// ç¹å»åªä¸ªViewæ¶æ¾èµ«æç¤º |
| | | /// </summary> |
| | | public void Show(View view) |
| | | { |
| | | Display display = Application.Activity.WindowManager.DefaultDisplay; |
| | | // è·åå±å¹é«åº¦ |
| | | Toast toast = Toast.MakeText (Application.Activity, Text, ToastLength.Long); |
| | | // è¿éç»äºä¸ä¸ª1/4å±å¹é«åº¦çyè½´åç§»é |
| | | toast.SetGravity (GravityFlags.Center, 0, 0); |
| | | toast.Show (); |
| | | |
| | | |
| | | //popTip.ShowText (this.Text,Direction,MaxWidth, Application.MainUIViewController.View, view.RealView.ConvertRectToView(view.RealView.Bounds,Application.MainUIViewController.View),CloseTime); |
| | | } |
| | | |
| | | |
| | | } |
| | | |
| | | } |
| | | |
New file |
| | |
| | | using System; |
| | | |
| | | using System.Collections.Generic; |
| | | using Com.Hdl.Widget.CoverFlowViewPager; |
| | | |
| | | namespace Shared |
| | | { |
| | | |
| | | |
| | | |
| | | /// <summary> |
| | | /// UICoverFlowView |
| | | /// </summary> |
| | | public class UICoverFlowView : View |
| | | { |
| | | /// <summary> |
| | | /// å½åè§å¾ |
| | | /// </summary> |
| | | /// <value>The UICoverFlowView.</value> |
| | | HDLCoverFlowViewPager mHDLCoverFlowViewPager |
| | | { |
| | | get |
| | | { |
| | | return AndroidView as HDLCoverFlowViewPager; |
| | | } |
| | | set |
| | | { |
| | | AndroidView = value; |
| | | } |
| | | } |
| | | |
| | | /// <summary> |
| | | /// ç¶å®¹å¨ |
| | | /// </summary> |
| | | /// <value>The parent.</value> |
| | | ViewGroup Parents { get; set; } |
| | | |
| | | ///// <summary> |
| | | ///// è§å¾é«åº¦ |
| | | ///// </summary> |
| | | ///// <value>The height.</value> |
| | | //public override int Height |
| | | //{ |
| | | // get |
| | | // { |
| | | // return base.Height; |
| | | // } |
| | | // set |
| | | // { |
| | | // base.Height = value; |
| | | // if (!IsCanRefresh) |
| | | // { |
| | | // return; |
| | | // } |
| | | // var layoutParameters = realViewGroup.LayoutParameters; |
| | | // layoutParameters.Height = Height; |
| | | // realViewGroup.LayoutParameters = layoutParameters; |
| | | // } |
| | | //} |
| | | |
| | | ///// <summary> |
| | | ///// è§å¾å®½åº¦ |
| | | ///// </summary> |
| | | ///// <value>The width.</value> |
| | | //public override int Width |
| | | //{ |
| | | // get |
| | | // { |
| | | // return base.Width; |
| | | // } |
| | | // set |
| | | // { |
| | | // base.Width = value; |
| | | // if (!IsCanRefresh) |
| | | // { |
| | | // return; |
| | | // } |
| | | // var layoutParameters = realViewGroup.LayoutParameters; |
| | | // layoutParameters.Width = Width; |
| | | // realViewGroup.LayoutParameters = layoutParameters; |
| | | // } |
| | | //} |
| | | |
| | | /// <summary> |
| | | /// æé 彿° |
| | | /// </summary> |
| | | public UICoverFlowView() |
| | | { |
| | | mHDLCoverFlowViewPager = new HDLCoverFlowViewPager(Application.Activity); |
| | | //viewList.Add(new Button { }); |
| | | //UpdateViewsList(); |
| | | mHDLCoverFlowViewPager.InitBanner(mAndroidViewsList, true, 15f)//å¼å¯3Dç»å»ææ |
| | | .AddPageMargin(0, 100)//åæ°1pageä¹é´çé´è·,åæ°2ä¸é´itemè·ç¦»è¾¹ççé´è· |
| | | .FinishConfig()//è¿å¥å¿
é¡»å |
| | | .AddGalleryListener(new OnSelectChangeListener(this)); |
| | | |
| | | Parents = new ViewGroup(); |
| | | //Parents.AddChidren(this); |
| | | //mOnSelectChangeListener = new OnSelectChangeListener(this); |
| | | //mHDLCoverFlowViewPager.SetOptionsSelectChangeListener(mOnSelectChangeListener); |
| | | } |
| | | |
| | | |
| | | List<Android.Views.View> mAndroidViewsList = new List<Android.Views.View>(); |
| | | List<View> viewList = new List<View>(); |
| | | |
| | | private void UpdateViewsList() |
| | | { |
| | | |
| | | mAndroidViewsList.Clear(); |
| | | foreach (View MView in viewList) |
| | | { |
| | | mAndroidViewsList.Add(MView.AndroidView); |
| | | } |
| | | |
| | | mHDLCoverFlowViewPager.UpdateViewsList(mAndroidViewsList); |
| | | } |
| | | |
| | | int pageIndex; |
| | | /// <summary> |
| | | /// 设置æè
è·åå½åççé¢ç´¢å¼ |
| | | /// </summary> |
| | | /// <value>The index of the page.</value> |
| | | public int PageIndex |
| | | { |
| | | get |
| | | { |
| | | return pageIndex; |
| | | } |
| | | set |
| | | { |
| | | if (value < 0 || viewList.Count < value) |
| | | { |
| | | return; |
| | | } |
| | | |
| | | pageIndex = value; |
| | | mHDLCoverFlowViewPager.SetCurrentItem(pageIndex); |
| | | |
| | | |
| | | } |
| | | } |
| | | |
| | | |
| | | |
| | | public void Remove(View view) |
| | | { |
| | | if (view == null) |
| | | { |
| | | return; |
| | | } |
| | | |
| | | viewList.Remove(view); |
| | | //realViewGroup.RemoveView(view.AndroidView); |
| | | //view.Parent = null; |
| | | |
| | | //base.Remove(view); |
| | | //UpdateViewsList(); |
| | | } |
| | | |
| | | /// <summary> |
| | | /// å¢å åæ§ä»¶ |
| | | /// </summary> |
| | | /// <param name="view">View.</param> |
| | | public void AddChidren(View view) |
| | | { |
| | | view.Parent = Parents; |
| | | |
| | | viewList.Add(view); |
| | | |
| | | |
| | | UpdateViewsList(); |
| | | |
| | | view.Refresh(); |
| | | if (view is ViewGroup) |
| | | { |
| | | var tempViewGroup = (ViewGroup)view; |
| | | for (int i = 0; i < tempViewGroup.ChildrenCount; i++) |
| | | { |
| | | tempViewGroup.GetChildren(i).Refresh(); |
| | | } |
| | | } |
| | | |
| | | //base.AddChidren(view); |
| | | |
| | | |
| | | |
| | | } |
| | | |
| | | |
| | | /// <summary> |
| | | /// æ¸
空ææçæ§ä»¶ |
| | | /// </summary> |
| | | public void RemoveAll() |
| | | { |
| | | viewList.Clear(); |
| | | //base.RemoveAll(); |
| | | UpdateViewsList(); |
| | | } |
| | | |
| | | /// <summary> |
| | | /// ç§»é¤æå®ç´¢å¼å¯¹è±¡ |
| | | /// </summary> |
| | | /// <param name="index">Index.</param> |
| | | public void RemoveAt(int index) |
| | | { |
| | | if (GetChildren(index) != null) |
| | | { |
| | | viewList.Remove(GetChildren(index)); |
| | | UpdateViewsList(); |
| | | } |
| | | |
| | | //base.RemoveAt(index); |
| | | //UpdateViewsList(); |
| | | } |
| | | |
| | | |
| | | /// <summary> |
| | | /// è·åæå®ç´¢å¼å¯¹è±¡ |
| | | /// </summary> |
| | | /// <returns>The children.</returns> |
| | | /// <param name="index">Index.</param> |
| | | public View GetChildren(int index) |
| | | { |
| | | if (viewList.Count - 1 < index || index < 0) |
| | | { |
| | | return null; |
| | | } |
| | | return viewList[index]; |
| | | } |
| | | |
| | | |
| | | ///// <summary> |
| | | ///// ç§»é¤æ§ä»¶ |
| | | ///// </summary> |
| | | ///// <param name="view">View.</param> |
| | | //internal virtual void Remove(View view) |
| | | //{ |
| | | // if (view == null) |
| | | // { |
| | | // return; |
| | | // } |
| | | |
| | | // mViewsList.Remove(view); |
| | | // UpdateViewsList(mViewsList); |
| | | // view.Parent = null; |
| | | //} |
| | | |
| | | |
| | | ///// <summary> |
| | | ///// 设置PickerView é»è®¤éä¸é¡¹ |
| | | ///// </summary> |
| | | //public void setCurrentItems(int option1, int option2, int option3) |
| | | //{ |
| | | |
| | | // mHDLCoverFlowViewPager.SetCurrentItems(option1, option2, option3); |
| | | |
| | | //} |
| | | |
| | | |
| | | ///// <summary> |
| | | ///// 设置PickerViewæ°æ® |
| | | ///// </summary> |
| | | //public void setNPicker(List<string> mFirstList, List<string> mSecondList, List<string> mThirdList) |
| | | //{ |
| | | |
| | | // mHDLCoverFlowViewPager.SetNPicker(mFirstList, mSecondList, mThirdList); |
| | | |
| | | //} |
| | | |
| | | |
| | | ///// <summary> |
| | | ///// 设置PickerView é䏿åçé¢è² |
| | | ///// </summary> |
| | | //public void setTextColorCenter(uint mColor , int indexID) { |
| | | |
| | | // byte r, g, b, a; |
| | | // r = (byte)(mColor / 256 / 256 % 256); |
| | | // g = (byte)(mColor / 256 % 256); |
| | | // b = (byte)(mColor % 256); |
| | | // a = (byte)(mColor / 256 / 256 / 256 % 256); |
| | | |
| | | // mHDLCoverFlowViewPager.SetTextColorCenter(Android.Graphics.Color.Argb(a, r, g, b), indexID); |
| | | //} |
| | | |
| | | |
| | | |
| | | |
| | | public Action<int> OnSelectChangeEvent; |
| | | public Action<int> OnCoverFlowViewClickEvent; |
| | | |
| | | /// <summary> |
| | | /// OnProgressChangeListener ç»§æ¿ååºäºä»¶ |
| | | /// </summary> |
| | | OnSelectChangeListener mOnSelectChangeListener; |
| | | |
| | | |
| | | |
| | | public class OnSelectChangeListener : Java.Lang.Object, HDLCoverFlowViewPager.IOnClickGalleryListener |
| | | { |
| | | |
| | | UICoverFlowView _UICoverFlowView; |
| | | |
| | | public OnSelectChangeListener(UICoverFlowView view) |
| | | { |
| | | _UICoverFlowView = view; |
| | | } |
| | | |
| | | public void OnGalleryClick(int p0) |
| | | { |
| | | _UICoverFlowView.OnCoverFlowViewClickEvent?.Invoke(p0); |
| | | |
| | | _UICoverFlowView.pageIndex = p0; |
| | | } |
| | | |
| | | public void OnGalleryPositionChange(int p0) |
| | | { |
| | | _UICoverFlowView.OnSelectChangeEvent?.Invoke(p0); |
| | | _UICoverFlowView.pageIndex = p0; |
| | | |
| | | } |
| | | |
| | | |
| | | } |
| | | } |
| | | } |
New file |
| | |
| | | using System; |
| | | using Android.Content; |
| | | using Android.Views; |
| | | using Android.Support.V4.View; |
| | | using Android.Widget; |
| | | using Android.Support.V4.Widget; |
| | | |
| | | |
| | | namespace Shared |
| | | { |
| | | /// <summary> |
| | | /// 峿»æ½å±View |
| | | /// </summary> |
| | | public class UIDrawerLayout : ViewGroup |
| | | { |
| | | AndroidDrawerLayout androidDrawerLayout; |
| | | |
| | | /// <summary> |
| | | /// 宽度设置æè¯»å |
| | | /// </summary> |
| | | /// <value>The width.</value> |
| | | public override int Width |
| | | { |
| | | get |
| | | { |
| | | return base.Width; |
| | | } |
| | | set |
| | | { |
| | | base.Width = value; |
| | | if (!IsCanRefresh) |
| | | { |
| | | return; |
| | | } |
| | | var layoutParameters = androidDrawerLayout.LayoutParameters; |
| | | layoutParameters.Width = Width; |
| | | androidDrawerLayout.LayoutParameters = layoutParameters; |
| | | } |
| | | } |
| | | |
| | | /// <summary> |
| | | /// è§å¾é«åº¦ |
| | | /// </summary> |
| | | /// <value>The height.</value> |
| | | public override int Height |
| | | { |
| | | get |
| | | { |
| | | return base.Height; |
| | | } |
| | | set |
| | | { |
| | | base.Height = value; |
| | | if (!IsCanRefresh) |
| | | { |
| | | return; |
| | | } |
| | | var layoutParameters = androidDrawerLayout.LayoutParameters; |
| | | layoutParameters.Height = Height; |
| | | androidDrawerLayout.LayoutParameters = layoutParameters; |
| | | } |
| | | } |
| | | |
| | | LinearLayout leftLinarLayout; |
| | | |
| | | Android.Widget.FrameLayout mainLinarLayout; |
| | | |
| | | /// <summary> |
| | | /// 卿»å¨äºä»¶ä¸ï¼å¯æ¾ç¤ºéèäºèªå®ä¹è§å¾ |
| | | /// </summary> |
| | | public UIDrawerLayout() |
| | | { |
| | | //viewGroup = new Android.Widget.FrameLayout(Application.Activity); |
| | | androidDrawerLayout = new AndroidDrawerLayout(Application.Activity, this) { }; |
| | | |
| | | viewGroup = androidDrawerLayout; |
| | | |
| | | leftLinarLayout = new LinearLayout(Application.Activity) { Alpha = 1.0f }; |
| | | mainLinarLayout = new Android.Widget.FrameLayout(Application.Activity) { Alpha = 1.0f }; |
| | | |
| | | //viewGroup.AddView(androidDrawerLayout, new DrawerLayout.LayoutParams(DrawerLayout.LayoutParams.MatchParent, DrawerLayout.LayoutParams.MatchParent)); |
| | | realViewGroup = mainLinarLayout; |
| | | |
| | | DrawerLayout.LayoutParams lp = new DrawerLayout.LayoutParams(DrawerLayout.LayoutParams.MatchParent, DrawerLayout.LayoutParams.MatchParent); |
| | | androidDrawerLayout.AddView(mainLinarLayout, lp); |
| | | |
| | | |
| | | DrawerLayout.LayoutParams lp2 = new DrawerLayout.LayoutParams(Application.CurrentWidth, DrawerLayout.LayoutParams.MatchParent); |
| | | lp2.Gravity = GravityCompat.Start; |
| | | androidDrawerLayout.AddView(leftLinarLayout, lp2); |
| | | |
| | | |
| | | |
| | | } |
| | | |
| | | /// <summary> |
| | | /// æ¯å¦éå®å³æ»åè½ï¼ éå®å峿»å¼¹åºèå失æ |
| | | /// </summary> |
| | | bool _IsDrawerLockMode; |
| | | public bool IsDrawerLockMode |
| | | { |
| | | get⨠{⨠return _IsDrawerLockMode;⨠} |
| | | set |
| | | { |
| | | _IsDrawerLockMode = value; |
| | | if (_IsDrawerLockMode) |
| | | { |
| | | androidDrawerLayout.SetDrawerLockMode(DrawerLayout.LockModeLockedClosed); |
| | | } |
| | | else |
| | | { |
| | | androidDrawerLayout.SetDrawerLockMode(DrawerLayout.LockModeUnlocked); |
| | | } |
| | | } |
| | | } |
| | | |
| | | |
| | | |
| | | /// <summary> |
| | | /// æå¼æ½å±view |
| | | /// </summary> |
| | | public void OpenLeftMenu() |
| | | { |
| | | |
| | | if (!androidDrawerLayout.IsDrawerOpen(GravityCompat.Start)) |
| | | { |
| | | androidDrawerLayout.OpenDrawer(GravityCompat.Start); |
| | | } |
| | | //System.Console.WriteLine("DrawerLayout:OpenLeftMenu"); |
| | | } |
| | | |
| | | |
| | | |
| | | /// <summary> |
| | | /// å
³éæ½å±view |
| | | /// </summary> |
| | | public void CloseLeftMenu() |
| | | { |
| | | if (androidDrawerLayout.IsDrawerOpen(GravityCompat.Start)) |
| | | { |
| | | androidDrawerLayout.CloseDrawer(GravityCompat.Start); |
| | | } |
| | | |
| | | //System.Console.WriteLine("DrawerLayout:CloseLeftMenu"); |
| | | } |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | /// <summary> |
| | | /// å¢å 左边è§å¾ |
| | | /// </summary> |
| | | /// <param name="view">View.</param> |
| | | public void AddLeftView(View view) |
| | | { |
| | | |
| | | view.Parent = this; |
| | | if (view.AndroidView.Parent != null) |
| | | { |
| | | (view.AndroidView.Parent as Android.Views.ViewGroup)?.RemoveView(view.AndroidView); |
| | | } |
| | | leftLinarLayout.AddView(view.AndroidView, new Android.Views.ViewGroup.LayoutParams(leftLinarLayout.LayoutParameters.Width, leftLinarLayout.LayoutParameters.Height)); |
| | | |
| | | //view.Width = leftLinarLayout.LayoutParameters.Width; |
| | | //view.Height = leftLinarLayout.LayoutParameters.Height; |
| | | //view.Refresh(); |
| | | |
| | | } |
| | | |
| | | /// <summary> |
| | | /// RemoveLeftView |
| | | /// </summary> |
| | | public void LeftViewRemoveAllViews() |
| | | { |
| | | if (leftLinarLayout == null) return; |
| | | leftLinarLayout.RemoveAllViews(); |
| | | } |
| | | |
| | | |
| | | |
| | | |
| | | class AndroidDrawerLayout : DrawerLayout |
| | | { |
| | | View _view; |
| | | int mTouchSlop |
| | | { |
| | | get |
| | | { |
| | | var configuration = ViewConfiguration.Get(Context); |
| | | //æå°çæ»å¨è·ç¦» |
| | | return configuration.ScaledTouchSlop; |
| | | } |
| | | } |
| | | public AndroidDrawerLayout(Context context, View view) |
| | | : base(context) |
| | | { |
| | | _view = view; |
| | | |
| | | } |
| | | |
| | | //float mLastX, mLastY; |
| | | ////internal bool isShowLeft; |
| | | ////internal bool isShowRight; |
| | | //public Action RightToLeftAction; |
| | | //public Action LeftToRightAction; |
| | | //bool isActioned; |
| | | //bool action(MotionEvent e) |
| | | //{ |
| | | // switch (e.Action) |
| | | // { |
| | | // case MotionEventActions.Down: |
| | | // //è®°å½ç¹å»çææ°Xåæ |
| | | // mLastX = e.RawX; |
| | | // mLastY = e.RawY; |
| | | // Parent?.RequestDisallowInterceptTouchEvent(true); |
| | | // break; |
| | | // case MotionEventActions.Move: |
| | | // var x = e.RawX; |
| | | // var y = e.RawY; |
| | | // var deltaX = x - mLastX; |
| | | // var deltaY = y - mLastY; |
| | | |
| | | // if (Math.Abs(deltaY) < Math.Abs(deltaX)) |
| | | // { |
| | | // if (!isActioned) |
| | | // { |
| | | // //RightToLeftAction |
| | | // if (deltaX < -mTouchSlop) |
| | | // { |
| | | |
| | | // if (x / this.Width >= 0.5) |
| | | // { |
| | | |
| | | // isActioned = true; |
| | | // //parentDelay(true); |
| | | // System.Console.WriteLine("DrawerLayout:DispatchTouchEvent:RightToLeft"); |
| | | // RightToLeftAction?.Invoke(); |
| | | // } |
| | | // } |
| | | // //LeftToRightAction |
| | | // if (mTouchSlop < deltaX) |
| | | // { |
| | | // if (x / this.Width <= 0.5) |
| | | // { |
| | | // isActioned = true; |
| | | // //parentDelay(true); |
| | | // System.Console.WriteLine("DrawerLayout:DispatchTouchEvent:LeftToRight"); |
| | | // LeftToRightAction?.Invoke(); |
| | | // } |
| | | // } |
| | | // } |
| | | // return true; |
| | | // } |
| | | // else |
| | | // { |
| | | // //ä¸ä¸æ»å¨æ¶ï¼å
è®¸ç¶æ§ä»¶çæ¦æª |
| | | // if (4 < Math.Abs(deltaY)) |
| | | // { |
| | | // Parent?.RequestDisallowInterceptTouchEvent(false); |
| | | // } |
| | | // } |
| | | // break; |
| | | // } |
| | | // return false; |
| | | //} |
| | | |
| | | ///// <summary> |
| | | ///// æ§è¡OnInterceptTouchEventåOnTouchEvent |
| | | ///// </summary> |
| | | ///// <returns><c>true</c>äºä»¶å·²ç»å¤ç<c>false</c>äºä»¶æ²¡æå¤ç</returns> |
| | | ///// <param name="e">E.</param> |
| | | //public override bool DispatchTouchEvent(MotionEvent e) |
| | | //{ |
| | | // //System.Console.WriteLine($"{GetType()} Height->{Height} Width->{Width} DispatchTouchEvent->{e.Action}"); |
| | | // if (e.Action == MotionEventActions.Down) |
| | | // { |
| | | // isActioned = false; |
| | | // //è¿åå
è®¸æ¦æªäºä»¶ |
| | | // RequestDisallowInterceptTouchEvent(false); |
| | | // } |
| | | // return base.DispatchTouchEvent(e); |
| | | //} |
| | | |
| | | //public override bool OnInterceptTouchEvent(MotionEvent e) |
| | | //{ |
| | | // //System.Console.WriteLine($"{GetType()} Height->{Height} Width->{Width} OnInterceptTouchEvent->{e.Action}"); |
| | | // if (disallowIntercept) |
| | | // { |
| | | // return false; |
| | | // } |
| | | // if (action(e)) |
| | | // { |
| | | // return true; |
| | | // } |
| | | // return base.OnInterceptTouchEvent(e); |
| | | //} |
| | | |
| | | ///// <summary> |
| | | ///// éåç¹å»äºä»¶ |
| | | ///// </summary> |
| | | ///// <returns><c>true</c>, if touch event was oned, <c>false</c> otherwise.</returns> |
| | | ///// <param name="e">E.</param> |
| | | //public override bool OnTouchEvent(MotionEvent e) |
| | | //{ |
| | | // //System.Console.WriteLine($"{GetType()} Height->{Height} Width->{Width} OnTouchEvent->{e.Action}"); |
| | | // if (!isActioned) |
| | | // { |
| | | // _view.TouchEvent(e); |
| | | // } |
| | | // action(e); |
| | | // return true; |
| | | //} |
| | | //bool disallowIntercept; |
| | | //public override void RequestDisallowInterceptTouchEvent(bool disallowIntercept) |
| | | //{ |
| | | // this.disallowIntercept = disallowIntercept; |
| | | // //System.Console.WriteLine($"{GetType()} Height->{Height} RequestDisallowInterceptTouchEvent->{disallowIntercept}"); |
| | | // base.RequestDisallowInterceptTouchEvent(disallowIntercept); |
| | | // Parent?.RequestDisallowInterceptTouchEvent(disallowIntercept); |
| | | //} |
| | | } |
| | | } |
| | | } |
| | | |
| | | |
| | | |
New file |
| | |
| | | using System; |
| | | |
| | | using Com.Hdl.Widget.Pickerview.View; |
| | | using Com.Hdl.Widget.Pickerview.Listener; |
| | | using System.Collections.Generic; |
| | | using Java.Util; |
| | | |
| | | |
| | | namespace Shared |
| | | { |
| | | |
| | | |
| | | |
| | | /// <summary> |
| | | /// UIPickerView |
| | | /// </summary> |
| | | public class UIPickerView : View |
| | | { |
| | | /// <summary> |
| | | /// å½åè§å¾ |
| | | /// </summary> |
| | | /// <value>The UIPickerView.</value> |
| | | HDLPickerViewNT mPickerViewNT |
| | | { |
| | | get |
| | | { |
| | | return AndroidView as HDLPickerViewNT; |
| | | } |
| | | set |
| | | { |
| | | AndroidView = value; |
| | | } |
| | | } |
| | | |
| | | /// <summary> |
| | | /// æé 彿° |
| | | /// </summary> |
| | | public UIPickerView() |
| | | { |
| | | mPickerViewNT = new HDLPickerViewNT(Application.Activity); |
| | | |
| | | mOnSelectChangeListener = new OnSelectChangeListener(this); |
| | | mPickerViewNT.SetOptionsSelectChangeListener(mOnSelectChangeListener); |
| | | } |
| | | |
| | | |
| | | /// <summary> |
| | | /// 设置PickerView é»è®¤éä¸é¡¹ |
| | | /// </summary> |
| | | public void setCurrentItems(int option1, int option2, int option3) |
| | | { |
| | | |
| | | mPickerViewNT.SetCurrentItems(option1, option2, option3); |
| | | |
| | | } |
| | | |
| | | |
| | | /// <summary> |
| | | /// 设置PickerViewæ°æ® |
| | | /// </summary> |
| | | //public void setPicker(List<string> mFirstList, List<List<string>> mSecondList, List<List<List<string>>> mThirdList) |
| | | //{ |
| | | |
| | | // mPickerViewNT.SetPicker(mFirstList, mSecondList, mThirdList); |
| | | |
| | | private static string SPLIT_FLAG = ">-<"; |
| | | |
| | | //} |
| | | /// <summary> |
| | | /// 设置PickerViewæ°æ® è卿æ |
| | | /// </summary> |
| | | public void setPicker(List<string> mFirstList, List<List<string>> mSecondList) |
| | | { |
| | | |
| | | if (mFirstList == null) |
| | | { |
| | | return; |
| | | } |
| | | |
| | | if (mFirstList.Count != mSecondList.Count) |
| | | { |
| | | return; |
| | | } |
| | | |
| | | |
| | | var mSpliceList = new List<string>();//æ¼æ¥åçæ°ç» |
| | | for (int i = 0; i < mSecondList.Count; i++) |
| | | { |
| | | string mDataStr = ""; |
| | | for (int j = 0; j < mSecondList[i].Count; j++) |
| | | { |
| | | mDataStr += mSecondList[i][j] + SPLIT_FLAG; |
| | | } |
| | | mSpliceList.Add(mDataStr); |
| | | |
| | | } |
| | | |
| | | mPickerViewNT.SetPickerString(mFirstList, mSpliceList); |
| | | |
| | | |
| | | //IList<IList<string>> newSecondList = new List<IList<string>>(); |
| | | |
| | | |
| | | //foreach (List<string> mm in mSecondList) |
| | | //{ |
| | | // newSecondList.Add(mm); |
| | | //} |
| | | |
| | | |
| | | //mPickerViewNT.SetPicker(mFirstList, newSecondList); |
| | | |
| | | |
| | | |
| | | //IDictionary<string, IList<string>> newSecondListDictionary = new Dictionary<string, IList<string>>(); |
| | | |
| | | ////foreach (List<string> mm in mSecondList) |
| | | ////{ |
| | | //// newSecondListDictionary.Add(mFirstList ); |
| | | ////} |
| | | |
| | | //for(int i=0;i< mFirstList.Count;i++) |
| | | //{ |
| | | // newSecondListDictionary.Add(mFirstList[i], mSecondList[i]); |
| | | //} |
| | | |
| | | //mPickerViewNT.SetPickerHashMap(mFirstList, newSecondListDictionary); |
| | | |
| | | } |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | /// <summary> |
| | | /// 设置PickerViewæ°æ® ä¸èå¨ |
| | | /// </summary> |
| | | public void setNPicker(List<string> mFirstList, List<string> mSecondList, List<string> mThirdList) |
| | | { |
| | | |
| | | mPickerViewNT.SetNPicker(mFirstList, mSecondList, mThirdList); |
| | | |
| | | } |
| | | |
| | | |
| | | /// <summary> |
| | | /// 设置PickerView é䏿åçé¢è² |
| | | /// </summary> |
| | | public void setTextColorCenter(uint mColor , int indexID) { |
| | | |
| | | byte r, g, b, a; |
| | | r = (byte)(mColor / 256 / 256 % 256); |
| | | g = (byte)(mColor / 256 % 256); |
| | | b = (byte)(mColor % 256); |
| | | a = (byte)(mColor / 256 / 256 / 256 % 256); |
| | | |
| | | mPickerViewNT.SetTextColorCenter(Android.Graphics.Color.Argb(a, r, g, b), indexID); |
| | | } |
| | | |
| | | |
| | | public Action<int, int, int> OnSelectChangeEvent; |
| | | |
| | | /// <summary> |
| | | /// OnProgressChangeListener ç»§æ¿ååºäºä»¶ |
| | | /// </summary> |
| | | OnSelectChangeListener mOnSelectChangeListener; |
| | | |
| | | public class OnSelectChangeListener : Java.Lang.Object, IOnOptionsSelectChangeListener |
| | | { |
| | | |
| | | UIPickerView _UIPickerView; |
| | | |
| | | public OnSelectChangeListener(UIPickerView view) |
| | | { |
| | | _UIPickerView = view; |
| | | } |
| | | |
| | | public void OnOptionsSelectChanged(int selectIndex1, int selectIndex2, int selectIndex3) |
| | | { |
| | | _UIPickerView.OnSelectChangeEvent?.Invoke(selectIndex1, selectIndex2, selectIndex3); |
| | | } |
| | | } |
| | | |
| | | |
| | | |
| | | } |
| | | } |
New file |
| | |
| | | using System; |
| | | using System.Net; |
| | | using Android.Graphics; |
| | | using Android.Graphics.Drawables; |
| | | |
| | | namespace Shared |
| | | { |
| | | public class UrlMonitor : View |
| | | { |
| | | public UrlMonitor() |
| | | { |
| | | AndroidView = new Android.Widget.TextView(Application.Activity); |
| | | } |
| | | |
| | | //æ¯å¦å·²ç»å¯å¨ |
| | | bool isStarted; |
| | | /// <summary> |
| | | /// ç¨æ·å |
| | | /// </summary> |
| | | public string UserName = ""; |
| | | /// <summary> |
| | | /// å¯ç |
| | | /// </summary> |
| | | public string Password = ""; |
| | | |
| | | /// <summary> |
| | | /// æå头çå¾çå°å |
| | | /// </summary> |
| | | public string URL; |
| | | |
| | | /// <summary> |
| | | /// å¯å¨ |
| | | /// </summary> |
| | | public void Start() |
| | | { |
| | | if (isStarted) |
| | | { |
| | | return; |
| | | } |
| | | isStarted = true; |
| | | System.Threading.Tasks.Task.Run(() => |
| | | { |
| | | while (isStarted) |
| | | { |
| | | System.Threading.Thread.Sleep(100); |
| | | try |
| | | { |
| | | |
| | | WebClient webClient = new WebClient(); |
| | | webClient.Headers.Add("Accept-Encoding", "gzip, deflate"); |
| | | webClient.Headers.Add("Authorization", "Basic " + Convert.ToBase64String(System.Text.Encoding.ASCII.GetBytes(UserName + ":" + Password))); |
| | | var bytes = webClient.DownloadData(URL); |
| | | var bitmpap = BitmapFactory.DecodeByteArray(bytes, 0, bytes.Length); |
| | | |
| | | BitmapDrawable background = null; |
| | | if (Application.IsPad) |
| | | { |
| | | background = new BitmapDrawable(bitmpap); |
| | | } |
| | | else |
| | | { |
| | | var matrix = new Matrix(); |
| | | //æè½¬å¾ç å¨ä½ |
| | | matrix.PostRotate(90); |
| | | var newBitmpap = Bitmap.CreateBitmap(bitmpap, 0, 0, bitmpap.Width, bitmpap.Height, matrix, false); |
| | | background = new BitmapDrawable(newBitmpap); |
| | | if (bitmpap != newBitmpap) |
| | | { |
| | | bitmpap.Recycle(); |
| | | } |
| | | } |
| | | |
| | | Shared.Application.RunOnMainThread(() => |
| | | { |
| | | try |
| | | { |
| | | AndroidView.Background = background; |
| | | } |
| | | catch { } |
| | | }); |
| | | } |
| | | catch { } |
| | | } |
| | | }); |
| | | } |
| | | /// <summary> |
| | | /// åæ¢ææ¾ |
| | | /// </summary> |
| | | public void Stop() |
| | | { |
| | | isStarted = false; |
| | | } |
| | | } |
| | | } |
New file |
| | |
| | | using System;â¨using Android.Widget; |
| | | using Com.Scwang.Smartrefresh.Layout; |
| | | using Com.Scwang.Smartrefresh.Layout.Header; |
| | | using Com.Scwang.Smartrefresh.Layout.Listener; |
| | | using Com.Scwang.Smartrefresh.Layout.Api; |
| | | using Com.Scwang.Smartrefresh.Layout.Constant; |
| | | |
| | | namespace Sharedâ¨{ |
| | | |
| | | //VerticalRefreshLayout 另䏿巿° |
| | | /// <summary>⨠/// ä½ç½®å¸å±â¨ /// </summary>⨠public class VerticalRefreshLayout : ViewGroup⨠{⨠public Action BeginHeaderRefreshingAction; |
| | | |
| | | private ScrollView mAndroidRefreshScrolView; |
| | | private SmartRefreshLayout mSmartRefreshLayout; |
| | | |
| | | |
| | | /// <summary>⨠/// æé 彿°â¨ /// </summary>⨠public VerticalRefreshLayout()⨠{ |
| | | |
| | | |
| | | mSmartRefreshLayout = new SmartRefreshLayout(Application.Activity); |
| | | ClassicsHeader mClassicsHeader = new ClassicsHeader(Application.Activity); |
| | | //éèæåå·æ°æ¶é´æå |
| | | //mClassicsHeader.SetEnableLastTime(false); |
| | | |
| | | mSmartRefreshLayout.SetRefreshHeader(mClassicsHeader); |
| | | |
| | | mOnRefreshListener = new OnRefreshListener(this); |
| | | mSmartRefreshLayout.SetOnRefreshListener(mOnRefreshListener); |
| | | viewGroup = mSmartRefreshLayout; |
| | | |
| | | |
| | | mAndroidRefreshScrolView = new ScrollView(Application.Activity, null); |
| | | |
| | | viewGroup.AddView(mAndroidRefreshScrolView); |
| | | |
| | | realViewGroup = new AndroidLinearLayout(Application.Activity, this); |
| | | (realViewGroup as AndroidLinearLayout).Orientation = Orientation.Vertical; |
| | | mAndroidRefreshScrolView.AddView(realViewGroup); |
| | | |
| | | _isCanHeaderRefresh = true; |
| | | |
| | | } |
| | | |
| | | |
| | | OnRefreshListener mOnRefreshListener; |
| | | |
| | | public class OnRefreshListener : Java.Lang.Object, IOnRefreshListener |
| | | { |
| | | |
| | | VerticalRefreshLayout _VerticalRefreshLayout; |
| | | |
| | | public OnRefreshListener(VerticalRefreshLayout view) |
| | | { |
| | | _VerticalRefreshLayout = view; |
| | | } |
| | | |
| | | public void OnRefresh(IRefreshLayout p0) |
| | | { |
| | | _VerticalRefreshLayout.BeginHeaderRefreshingAction?.Invoke(); |
| | | } |
| | | } |
| | | |
| | | |
| | | /// <summary>⨠/// è§å¾å®½åº¦â¨ /// </summary>⨠/// <value>The width.</value>⨠public override int Width⨠{⨠get⨠{⨠return base.Width;⨠}⨠set⨠{⨠base.Width = value;⨠if (!IsCanRefresh)⨠{⨠return;⨠}⨠var layoutParameters = realViewGroup.LayoutParameters;⨠layoutParameters.Width = Width;⨠realViewGroup.LayoutParameters = layoutParameters;â¨â¨ }⨠}â¨â¨ /// <summary>⨠/// è§å¾é«åº¦â¨ /// </summary>⨠/// <value>The height.</value>⨠public override int Height⨠{⨠get⨠{⨠return base.Height;⨠}⨠set⨠{⨠base.Height = value;⨠if (!IsCanRefresh)⨠{⨠return;⨠}⨠var layoutParameters = realViewGroup.LayoutParameters;⨠layoutParameters.Height = Height;⨠realViewGroup.LayoutParameters = layoutParameters;⨠}⨠} |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | ///// <summary> |
| | | ///// æ¯å¦å
许æ»å¨ |
| | | ///// </summary> |
| | | ///// <value><c>true</c> if scroll enabled; otherwise, <c>false</c>.</value> |
| | | //public bool ScrollEnabled |
| | | //{ |
| | | // get |
| | | // { |
| | | // return (mAndroidRefreshScrolView as AndroidScrolView).ScrollEnable; |
| | | // } |
| | | // set |
| | | // { |
| | | // (mAndroidRefreshScrolView as AndroidScrolView).ScrollEnable = value; |
| | | // } |
| | | //} |
| | | |
| | | ///// <summary> |
| | | ///// æ¯å¦æ£å¨æ»å¨ |
| | | ///// </summary> |
| | | ///// <value><c>true</c> if decelerating; otherwise, <c>false</c>.</value> |
| | | //public bool Decelerating |
| | | //{ |
| | | // get |
| | | // { |
| | | // return false; |
| | | // } |
| | | //} |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | //***************************䏿巿°*************************** |
| | | /// <summary>⨠/// æ¯å¦æ¯æä¸æå·æ°â¨ /// </summary> |
| | | bool _isCanHeaderRefresh; |
| | | private bool IsCanHeaderRefresh |
| | | { |
| | | get⨠{⨠return _isCanHeaderRefresh;⨠} |
| | | set |
| | | { |
| | | _isCanHeaderRefresh = value; |
| | | } |
| | | } |
| | | |
| | | |
| | | /// <summary>⨠/// 头å¼å§å·æ°â¨ /// </summary> |
| | | public void BeginHeaderRefreshing() |
| | | { |
| | | if (!IsCanHeaderRefresh) return; |
| | | |
| | | if (mSmartRefreshLayout.State != RefreshState.Refreshing) |
| | | { |
| | | mSmartRefreshLayout.AutoRefresh(); |
| | | //System.Console.WriteLine("AutoRefresh"); |
| | | |
| | | } |
| | | } |
| | | |
| | | /// <summary>⨠/// å¤´ç»æå·æ°â¨ /// </summary> |
| | | public void EndHeaderRefreshing() |
| | | { |
| | | if (!IsCanHeaderRefresh) return; |
| | | |
| | | if (mSmartRefreshLayout.State == RefreshState.Refreshing) |
| | | { |
| | | mSmartRefreshLayout.FinishRefresh(); |
| | | //System.Console.WriteLine("FinishRefresh"); |
| | | |
| | | } |
| | | } |
| | | |
| | | /// <summary>⨠/// æ¯å¦æ¾ç¤ºæ»å¨æ¡â¨ /// </summary> |
| | | //bool _IsShowScrollBar; |
| | | public bool VerticalScrollBarEnabled |
| | | { |
| | | get⨠{⨠return mAndroidRefreshScrolView.VerticalScrollBarEnabled;⨠} |
| | | set |
| | | { |
| | | mAndroidRefreshScrolView.VerticalScrollBarEnabled = value; |
| | | |
| | | } |
| | | } |
| | | |
| | | |
| | | |
| | | ////***************************䏿å è½½*************************** |
| | | ///// <summary> |
| | | ///// æ¯å¦æ£å¨ä¸æå è½½ |
| | | ///// </summary> |
| | | //bool _isFooterRefreshing; |
| | | //public bool IsFooterRefreshing |
| | | //{ |
| | | // get |
| | | // { |
| | | // return _isFooterRefreshing; |
| | | // } |
| | | // set |
| | | // { |
| | | // _isFooterRefreshing = value; |
| | | // } |
| | | //} |
| | | |
| | | |
| | | ///// <summary> |
| | | ///// åºé¨ å¼å§ä¸æå è½½ |
| | | ///// </summary> |
| | | //public void beginFooterRefreshing() |
| | | //{ |
| | | // if (!IsCanFooterRefresh) return; |
| | | |
| | | // if (!IsFooterRefreshing) |
| | | // { |
| | | |
| | | // mFooterLoadingView.Start(mHeaderRefreshText); |
| | | // IsFooterRefreshing = true; |
| | | // beginFooterRefreshingAction?.Invoke(); |
| | | // } |
| | | //} |
| | | |
| | | ///// <summary> |
| | | ///// åºé¨ ç»æä¸æå è½½ |
| | | ///// </summary> |
| | | //public void endFooterRefreshing() |
| | | //{ |
| | | // if (!IsCanFooterRefresh) return; |
| | | |
| | | // if (IsFooterRefreshing) |
| | | // { |
| | | // mFooterLoadingView.Hide(); |
| | | // IsFooterRefreshing = false; |
| | | // } |
| | | //} |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | } |
| | | |
| | | ///// <summary> |
| | | ///// ç«ç´æ¹åæ»å¨æ§ä»¶ |
| | | ///// </summary> |
| | | //class AndroidRefreshScrolView : Android.Widget.ScrollView |
| | | //{ |
| | | // /// <summary> |
| | | // /// æ¯å¦å
许æ»å¨ |
| | | // /// </summary> |
| | | // public bool ScrollEnable = true; |
| | | |
| | | // public Action AlreadyToTopAction; |
| | | // public Action AlreadyToTopUpAction; |
| | | // public Action AlreadyToBottomAction; |
| | | |
| | | |
| | | |
| | | |
| | | // View _view; |
| | | // /// <summary> |
| | | // /// æé 彿° |
| | | // /// </summary> |
| | | // /// <param name="context">Context.</param> |
| | | // /// <param name="view">View.</param> |
| | | // public AndroidRefreshScrolView(Context context, View view) |
| | | // : base(context) |
| | | // { |
| | | // _view = view; |
| | | // VerticalScrollBarEnabled = true; |
| | | // //mScroller = new Scroller(context, new DecelerateInterpolator()); |
| | | // } |
| | | |
| | | |
| | | // bool bAlreadyToTop; |
| | | |
| | | // public override bool DispatchTouchEvent(MotionEvent e) |
| | | // { |
| | | // //System.Console.WriteLine($"{GetType()} Height->{Height} Width->{Width} DispatchTouchEvent->{e.Action}"); |
| | | // if (e.Action == MotionEventActions.Down) |
| | | // { |
| | | // //è¿åå
è®¸æ¦æªäºä»¶ |
| | | // RequestDisallowInterceptTouchEvent(false); |
| | | // } |
| | | // return base.DispatchTouchEvent(e); |
| | | // } |
| | | |
| | | // float mLastX, mLastY ; |
| | | // public override bool OnInterceptTouchEvent(MotionEvent ev) |
| | | // { |
| | | // //System.Console.WriteLine($"{GetType()} Height->{Height} Width->{Width} OnInterceptTouchEvent->{ev.Action}"); |
| | | |
| | | // if (!ScrollEnable || disallowIntercept) |
| | | // { |
| | | // return false; |
| | | // } |
| | | |
| | | // switch (ev.Action) |
| | | // { |
| | | // case MotionEventActions.Down: |
| | | // mLastX = ev.RawX; |
| | | // mLastY = ev.RawY; |
| | | // bAlreadyToTop = false; |
| | | // System.Console.WriteLine($"MotionEventActions.Down"); |
| | | // Parent?.RequestDisallowInterceptTouchEvent(true); |
| | | // break; |
| | | // case MotionEventActions.Up: |
| | | |
| | | // Parent?.RequestDisallowInterceptTouchEvent(true); |
| | | // System.Console.WriteLine($"MotionEventActions.Up"); |
| | | // if (bAlreadyToTop) |
| | | // { |
| | | // AlreadyToTopUpAction?.Invoke(); |
| | | // System.Console.WriteLine($"AlreadyToTopUpAction"); |
| | | // } |
| | | // break; |
| | | // case MotionEventActions.Move: |
| | | // var x = ev.RawX; |
| | | // var y = ev.RawY; |
| | | // var deltaX = x - mLastX; |
| | | // var deltaY = y - mLastY; |
| | | // System.Console.WriteLine($"MotionEventActions.Move"); |
| | | |
| | | // if (Math.Abs(deltaX) < Math.Abs(deltaY)) |
| | | // { |
| | | // //å䏿»å¨ï¼å¦æå½åå·²ç»æ»å¨å°é¡¶ï¼å°±å
è®¸ç¶æ§ä»¶çæ¦æªäºä»¶ |
| | | // if (deltaY > 0 && ScrollY == 0) |
| | | // { |
| | | // bAlreadyToTop = true; |
| | | // AlreadyToTopAction?.Invoke(); |
| | | // Parent?.RequestDisallowInterceptTouchEvent(false); |
| | | |
| | | |
| | | |
| | | // return false; |
| | | // } |
| | | // //å䏿»å¨æ¶ï¼å¦ætranslateYçäºé«åº¦æ¶ï¼å³è¡¨ææ»å¨å°åºé¨ï¼å¯åé¡¶å±Viewæ§å¶æ»å¨ |
| | | // var mChildH = 0; |
| | | // if (0 < ChildCount) |
| | | // { |
| | | // mChildH = GetChildAt(ChildCount - 1).Bottom; |
| | | // } |
| | | // var translateY = mChildH - ScrollY; |
| | | // if (deltaY < 0 && translateY == Height) |
| | | // { |
| | | // AlreadyToBottomAction?.Invoke(); |
| | | // Parent?.RequestDisallowInterceptTouchEvent(false); |
| | | |
| | | // return false; |
| | | // } |
| | | // } |
| | | // else |
| | | // { |
| | | // //左峿»å¨æ¶ï¼å
è®¸ç¶æ§ä»¶çæ¦æª |
| | | // if (4 < Math.Abs(deltaX)) |
| | | // { |
| | | // Parent?.RequestDisallowInterceptTouchEvent(false); |
| | | // } |
| | | // } |
| | | // break; |
| | | // } |
| | | |
| | | // return base.OnInterceptTouchEvent(ev); |
| | | // } |
| | | // /// <summary> |
| | | // /// éåç¹å»äºä»¶ |
| | | // /// </summary> |
| | | // /// <returns><c>true</c>, if touch event was oned, <c>false</c> otherwise.</returns> |
| | | // /// <param name="e">E.</param> |
| | | // public override bool OnTouchEvent(MotionEvent e) |
| | | // { |
| | | // //System.Console.WriteLine($"{GetType()} Height->{Height} Width->{Width} OnInterceptTouchEvent->{e.Action}"); |
| | | // _view?.TouchEvent(e); |
| | | // base.OnTouchEvent(e); |
| | | // //妿è¿åçç¶æ§ä»¶å°±ä¸éè¦å¤çäº |
| | | // return true; |
| | | // } |
| | | // bool disallowIntercept; |
| | | // public override void RequestDisallowInterceptTouchEvent(bool disallowIntercept) |
| | | // { |
| | | // this.disallowIntercept = disallowIntercept; |
| | | // //System.Console.WriteLine($"{GetType()} Height->{Height} RequestDisallowInterceptTouchEvent->{disallowIntercept}"); |
| | | // base.RequestDisallowInterceptTouchEvent(disallowIntercept); |
| | | // Parent?.RequestDisallowInterceptTouchEvent(disallowIntercept); |
| | | // } |
| | | //} |
| | | |
| | | |
| | | |
| | | |
| | | } |
| | | |
New file |
| | |
| | | using System;â¨using Android.Widget;â¨using Android.Content;â¨using Android.Views;â¨using Android.Util;â¨using Android.Runtime;â¨â¨namespace Sharedâ¨{⨠//æ»å¨å²çªé®é¢åé¢è¿å¾å®å⨠/// <summary>⨠/// ä½ç½®å¸å±â¨ /// </summary>⨠public class VerticalScrolViewLayout : ViewGroup⨠{⨠/// <summary>⨠/// æé 彿°â¨ /// </summary>⨠public VerticalScrolViewLayout()⨠{⨠viewGroup = new AndroidScrolView(Application.Activity, null);⨠realViewGroup = new AndroidLinearLayout(Application.Activity, this);⨠(realViewGroup as AndroidLinearLayout).Orientation = Orientation.Vertical;⨠viewGroup.AddView(realViewGroup);⨠}â¨â¨â¨ /// <summary>⨠/// è§å¾å®½åº¦â¨ /// </summary>⨠/// <value>The width.</value>⨠public override int Width⨠{⨠get⨠{⨠return base.Width;⨠}⨠set⨠{⨠base.Width = value;⨠if (!IsCanRefresh)⨠{⨠return;⨠}⨠var layoutParameters = realViewGroup.LayoutParameters;⨠layoutParameters.Width = Width;⨠realViewGroup.LayoutParameters = layoutParameters;â¨â¨ }⨠}â¨â¨ /// <summary>⨠/// è§å¾é«åº¦â¨ /// </summary>⨠/// <value>The height.</value>⨠public override int Height⨠{⨠get⨠{⨠return base.Height;⨠}⨠set⨠{⨠base.Height = value;⨠if (!IsCanRefresh)⨠{⨠return;⨠}⨠var layoutParameters = realViewGroup.LayoutParameters;⨠layoutParameters.Height = Height;⨠realViewGroup.LayoutParameters = layoutParameters;⨠}⨠}â¨â¨ /// <summary>⨠/// æ¯å¦å
许æ»å¨â¨ /// </summary>⨠/// <value><c>true</c> if scroll enabled; otherwise, <c>false</c>.</value>⨠public bool ScrollEnabled⨠{⨠get⨠{⨠return (viewGroup as AndroidScrolView).ScrollEnable;⨠}⨠set⨠{⨠(viewGroup as AndroidScrolView).ScrollEnable = value;⨠}⨠}â¨â¨ /// <summary>⨠/// æ¯å¦æ£å¨æ»å¨â¨ /// </summary>⨠/// <value><c>true</c> if decelerating; otherwise, <c>false</c>.</value>⨠public bool Decelerating⨠{⨠get⨠{⨠return false;⨠}⨠}⨠}â¨â¨ /// <summary>⨠/// ç«ç´æ¹åæ»å¨æ§ä»¶â¨ /// </summary>⨠class AndroidScrolView : Android.Widget.ScrollView⨠{⨠/// <summary>⨠/// æ¯å¦å
许æ»å¨â¨ /// </summary>⨠public bool ScrollEnable = true;⨠View _view;⨠/// <summary>⨠/// æé 彿°â¨ /// </summary>⨠/// <param name="context">Context.</param>⨠/// <param name="view">View.</param>⨠public AndroidScrolView(Context context, View view)⨠: base(context)⨠{⨠_view = view;⨠VerticalScrollBarEnabled = true;⨠}â¨â¨â¨â¨ public override bool DispatchTouchEvent(MotionEvent e) |
| | | { |
| | | System.Console.WriteLine($"{GetType()} Height->{Height} Width->{Width} DispatchTouchEvent->{e.Action}"); |
| | | if (e.Action == MotionEventActions.Down) |
| | | {⨠//è¿åå
è®¸æ¦æªäºä»¶ |
| | | RequestDisallowInterceptTouchEvent(false);⨠} |
| | | return base.DispatchTouchEvent(e); |
| | | } |
| | | |
| | | float mLastX, mLastY ;⨠public override bool OnInterceptTouchEvent(MotionEvent ev)⨠{⨠System.Console.WriteLine($"{GetType()} Height->{Height} Width->{Width} OnInterceptTouchEvent->{ev.Action}"); |
| | | |
| | | if (!ScrollEnable || disallowIntercept)⨠{⨠return false;⨠} |
| | | |
| | | switch (ev.Action) |
| | | {⨠case MotionEventActions.Down:⨠mLastX = ev.RawX;⨠mLastY = ev.RawY;⨠Parent?.RequestDisallowInterceptTouchEvent(true);⨠break;⨠case MotionEventActions.Move:⨠var x = ev.RawX;⨠var y = ev.RawY;⨠var deltaX = x - mLastX;⨠var deltaY = y - mLastY;â¨â¨ if (Math.Abs(deltaX) < Math.Abs(deltaY)) |
| | | { |
| | | //å䏿»å¨ï¼å¦æå½åå·²ç»æ»å¨å°é¡¶ï¼å°±å
è®¸ç¶æ§ä»¶çæ¦æªäºä»¶ |
| | | if (deltaY > 0 && ScrollY == 0) |
| | | { |
| | | Parent?.RequestDisallowInterceptTouchEvent(false); |
| | | return false; |
| | | } |
| | | //å䏿»å¨æ¶ï¼å¦ætranslateYçäºé«åº¦æ¶ï¼å³è¡¨ææ»å¨å°åºé¨ï¼å¯åé¡¶å±Viewæ§å¶æ»å¨ |
| | | var mChildH = 0; |
| | | if (0 < ChildCount) |
| | | { |
| | | mChildH = GetChildAt(ChildCount - 1).Bottom; |
| | | } |
| | | var translateY = mChildH - ScrollY; |
| | | if (deltaY < 0 && translateY == Height) |
| | | { |
| | | Parent?.RequestDisallowInterceptTouchEvent(false); |
| | | return false; |
| | | } |
| | | } |
| | | else |
| | | {⨠//左峿»å¨æ¶ï¼å
è®¸ç¶æ§ä»¶çæ¦æª |
| | | if (4 < Math.Abs(deltaX)) |
| | | { |
| | | Parent?.RequestDisallowInterceptTouchEvent(false); |
| | | }⨠}⨠break;⨠}â¨â¨ return base.OnInterceptTouchEvent(ev);⨠}⨠/// <summary>⨠/// éåç¹å»äºä»¶â¨ /// </summary>⨠/// <returns><c>true</c>, if touch event was oned, <c>false</c> otherwise.</returns>⨠/// <param name="e">E.</param>⨠public override bool OnTouchEvent(MotionEvent e)⨠{⨠System.Console.WriteLine($"{GetType()} Height->{Height} Width->{Width} OnInterceptTouchEvent->{e.Action}");⨠_view?.TouchEvent(e);⨠base.OnTouchEvent(e);⨠//妿è¿åçç¶æ§ä»¶å°±ä¸éè¦å¤çäºâ¨ return true;⨠}⨠bool disallowIntercept;⨠public override void RequestDisallowInterceptTouchEvent(bool disallowIntercept)⨠{⨠this.disallowIntercept = disallowIntercept;⨠System.Console.WriteLine($"{GetType()} Height->{Height} RequestDisallowInterceptTouchEvent->{disallowIntercept}");⨠base.RequestDisallowInterceptTouchEvent(disallowIntercept);⨠Parent?.RequestDisallowInterceptTouchEvent(disallowIntercept);⨠}⨠}â¨} |
| | | |
New file |
| | |
| | | using System; |
| | | using Android.Widget; |
| | | using Android.Content; |
| | | using Android.Graphics; |
| | | using Android.Views; |
| | | using Android.Util; |
| | | using Android.Runtime; |
| | | |
| | | namespace Shared |
| | | { |
| | | //å·²ç»å
¨é¢æ£æ¥äºä»£ç |
| | | /// <summary> |
| | | /// ä½ç½®å¸å± |
| | | /// </summary> |
| | | public class VerticalSeekBar : View |
| | | { |
| | | /// <summary> |
| | | /// å½åè§å¾ |
| | | /// </summary> |
| | | /// <value>The android horizonetal seek bar.</value> |
| | | VerticalSeekBarAndroidFrameLayout verticalSeekBarAndroidFrameLayout |
| | | { |
| | | get |
| | | { |
| | | return AndroidView as VerticalSeekBarAndroidFrameLayout; |
| | | } |
| | | set |
| | | { |
| | | AndroidView = value; |
| | | } |
| | | } |
| | | Android.Widget.ImageView btnBackgroundColor; |
| | | /// <summary> |
| | | /// æ¾ç¤ºè¿åº¦æ§ä»¶ |
| | | /// </summary> |
| | | Android.Widget.ImageView btnProgressColor; |
| | | /// <summary> |
| | | /// æ»å |
| | | /// </summary> |
| | | Android.Widget.ImageView btnThum; |
| | | |
| | | |
| | | /// <summary> |
| | | /// å½åå®ä¾ |
| | | /// </summary> |
| | | public VerticalSeekBar() |
| | | { |
| | | verticalSeekBarAndroidFrameLayout = new VerticalSeekBarAndroidFrameLayout(Application.Activity, this); |
| | | btnBackgroundColor = new Android.Widget.ImageView(Application.Activity); |
| | | verticalSeekBarAndroidFrameLayout.AddView(btnBackgroundColor, new Android.Widget.FrameLayout.LayoutParams(DensityUtil.Dip2Px(1), 0, GravityFlags.CenterHorizontal)); |
| | | btnProgressColor = new Android.Widget.ImageView(Application.Activity); |
| | | verticalSeekBarAndroidFrameLayout.AddView(btnProgressColor, new Android.Widget.FrameLayout.LayoutParams(DensityUtil.Dip2Px(1), 0, GravityFlags.CenterHorizontal)); |
| | | btnThum = new Android.Widget.ImageView(Application.Activity); |
| | | verticalSeekBarAndroidFrameLayout.AddView(btnThum, new Android.Widget.FrameLayout.LayoutParams(DensityUtil.Dip2Px(24), DensityUtil.Dip2Px(24), GravityFlags.CenterHorizontal)); |
| | | |
| | | } |
| | | |
| | | internal override bool TouchEvent(MotionEvent e) |
| | | { |
| | | switch (e.Action) |
| | | { |
| | | case MotionEventActions.Down: |
| | | dateTime = DateTime.Now; |
| | | setButtonLoaction((int)e.GetY()); |
| | | break; |
| | | case MotionEventActions.Move: |
| | | setButtonLoaction((int)e.GetY()); |
| | | break; |
| | | case MotionEventActions.Cancel: |
| | | case MotionEventActions.Up: |
| | | dateTime = DateTime.MinValue; |
| | | setButtonLoaction((int)e.GetY()); |
| | | break; |
| | | } |
| | | return base.TouchEvent(e); |
| | | } |
| | | |
| | | /// <summary> |
| | | /// å½åè§å¾çé«åº¦ |
| | | /// </summary> |
| | | /// <value>The height.</value> |
| | | public override int Height |
| | | { |
| | | get |
| | | { |
| | | return base.Height; |
| | | } |
| | | set |
| | | { |
| | | base.Height = value; |
| | | |
| | | var frameBackgroundColor = btnBackgroundColor.LayoutParameters as Android.Widget.FrameLayout.LayoutParams; |
| | | frameBackgroundColor.Height = base.Height; |
| | | btnBackgroundColor.LayoutParameters = frameBackgroundColor; |
| | | } |
| | | } |
| | | DateTime dateTime; |
| | | /// <summary> |
| | | /// è¿åº¦ååäºä»¶ |
| | | /// </summary> |
| | | public Action<View, int> ProgressChanged; |
| | | |
| | | int max = 100; |
| | | /// <summary> |
| | | /// æå¤§å¼ |
| | | /// </summary> |
| | | /// <value>The max.</value> |
| | | public int Max |
| | | { |
| | | get |
| | | { |
| | | return max; |
| | | } |
| | | set |
| | | { |
| | | max = value; |
| | | } |
| | | } |
| | | bool isCanScrolled = true; |
| | | /// <summary> |
| | | /// æ¯å¦å
许æ»å¨æ»å |
| | | /// </summary> |
| | | /// <value><c>true</c> if is can scrolled; otherwise, <c>false</c>.</value> |
| | | public bool IsCanScrolled |
| | | { |
| | | get |
| | | { |
| | | return isCanScrolled; |
| | | } |
| | | set |
| | | { |
| | | isCanScrolled = value; |
| | | } |
| | | } |
| | | |
| | | int validHeight |
| | | { |
| | | get |
| | | { |
| | | return AndroidView.Height - btnThum.Height; |
| | | } |
| | | } |
| | | |
| | | //2019-08-29 æ¹100æ¯«ç§ |
| | | public int DelayTime = 100; |
| | | //鲿¢è·³å¨ï¼å»¶æ¶æ¾ç¤ºç¶æ |
| | | DateTime delayDateTime = DateTime.MinValue; |
| | | int progress; |
| | | /// <summary> |
| | | /// å½åè¿åº¦ |
| | | /// </summary> |
| | | /// <value>The progress.</value> |
| | | public int Progress |
| | | { |
| | | get |
| | | { |
| | | return (int)(Max * (validHeight - btnThum.Top) / validHeight); |
| | | } |
| | | set |
| | | { |
| | | progress = value; |
| | | if (!IsCanRefresh) |
| | | { |
| | | return; |
| | | } |
| | | //åéå½ä»¤å3000毫ç§å
䏿´æ°ç¶æï¼é²æ¢è·³å¨ |
| | | if ((DateTime.Now - delayDateTime).TotalMilliseconds < DelayTime) |
| | | { |
| | | return; |
| | | } |
| | | |
| | | if (Max < progress) |
| | | { |
| | | progress = Max; |
| | | } |
| | | var frameThum = btnThum.LayoutParameters as Android.Widget.FrameLayout.LayoutParams; |
| | | frameThum.TopMargin = (int)(1.0f * (Max - progress) / Max * validHeight); |
| | | btnThum.LayoutParameters = frameThum; |
| | | |
| | | var frameProgress = btnProgressColor.LayoutParameters as Android.Widget.FrameLayout.LayoutParams; |
| | | frameProgress.TopMargin = frameThum.TopMargin + frameThum.Height / 2; |
| | | frameProgress.Height = AndroidView.LayoutParameters.Height - frameProgress.TopMargin; |
| | | btnProgressColor.LayoutParameters = frameProgress; |
| | | } |
| | | } |
| | | |
| | | |
| | | |
| | | |
| | | /// <summary> |
| | | /// å·æ°å½å对象 |
| | | /// </summary> |
| | | public override void Refresh() |
| | | { |
| | | base.Refresh(); |
| | | ProgressColor = progressColor; |
| | | BackgroundColor = BackgroundColor; |
| | | ThumbColor = thumbColor; |
| | | Progress = progress; |
| | | } |
| | | |
| | | /// <summary> |
| | | /// æ»å¨ä¼ç æ¶é´ |
| | | /// </summary> |
| | | public int SleepTime = 0; |
| | | |
| | | |
| | | uint progressColor = 0x99000099; |
| | | /// <summary> |
| | | /// è¿åº¦è§å¾é¢è² |
| | | /// </summary> |
| | | /// <value>The color of the progress.</value> |
| | | public uint ProgressColor |
| | | { |
| | | get |
| | | { |
| | | return progressColor; |
| | | } |
| | | set |
| | | { |
| | | progressColor = value; |
| | | if (!IsCanRefresh) |
| | | { |
| | | return; |
| | | } |
| | | byte r, g, b, a; |
| | | r = (byte)(progressColor / 256 / 256 % 256); |
| | | g = (byte)(progressColor / 256 % 256); |
| | | b = (byte)(progressColor % 256); |
| | | a = (byte)(progressColor / 256 / 256 / 256 % 256); |
| | | |
| | | btnProgressColor.SetBackgroundColor(Android.Graphics.Color.Argb(a, r, g, b)); |
| | | } |
| | | } |
| | | |
| | | uint backgroundColor=0xFFFFFFFF; |
| | | /// <summary> |
| | | /// è¿åº¦è§å¾é¢è² |
| | | /// </summary> |
| | | /// <value>The color of the progress.</value> |
| | | public new uint BackgroundColor |
| | | { |
| | | get |
| | | { |
| | | return backgroundColor; |
| | | } |
| | | set |
| | | { |
| | | backgroundColor = value; |
| | | if (!IsCanRefresh) |
| | | { |
| | | return; |
| | | } |
| | | byte r, g, b, a; |
| | | r = (byte)(backgroundColor / 256 / 256 % 256); |
| | | g = (byte)(backgroundColor / 256 % 256); |
| | | b = (byte)(backgroundColor % 256); |
| | | a = (byte)(backgroundColor / 256 / 256 / 256 % 256); |
| | | |
| | | btnBackgroundColor.SetBackgroundColor(Android.Graphics.Color.Argb(a, r, g, b)); |
| | | } |
| | | } |
| | | |
| | | |
| | | uint thumbColor = 0xFFFFFFFF; |
| | | /// <summary> |
| | | /// æ»åé¢è² |
| | | /// </summary> |
| | | /// <value>The color of the background.</value> |
| | | public uint ThumbColor |
| | | { |
| | | get |
| | | { |
| | | return thumbColor; |
| | | } |
| | | set |
| | | { |
| | | thumbColor = value; |
| | | var gradientDrawable = new Android.Graphics.Drawables.GradientDrawable(); |
| | | gradientDrawable.SetCornerRadius(DensityUtil.Dip2Px(12)); |
| | | byte r, g, b, a; |
| | | r = (byte)(thumbColor / 256 / 256 % 256); |
| | | g = (byte)(thumbColor / 256 % 256); |
| | | b = (byte)(thumbColor % 256); |
| | | a = (byte)(thumbColor / 256 / 256 / 256 % 256); |
| | | gradientDrawable.SetColor(Android.Graphics.Color.Argb(a, r, g, b).ToArgb()); |
| | | btnThum.Background = gradientDrawable; |
| | | } |
| | | } |
| | | int beforValue = 0; |
| | | //å°å¾çç§»å¨å°ç¹å»çä½ç½® |
| | | void setButtonLoaction(int y) |
| | | { |
| | | if (!IsCanScrolled) |
| | | { |
| | | return; |
| | | } |
| | | delayDateTime = DateTime.Now; |
| | | if (y < 0) |
| | | { |
| | | y = 0; |
| | | } |
| | | |
| | | if (validHeight < y) |
| | | { |
| | | y = validHeight; |
| | | } |
| | | |
| | | var frameThum = btnThum.LayoutParameters as Android.Widget.FrameLayout.LayoutParams; |
| | | frameThum.TopMargin = y; |
| | | btnThum.LayoutParameters = frameThum; |
| | | |
| | | var frameProgress = btnProgressColor.LayoutParameters as Android.Widget.FrameLayout.LayoutParams; |
| | | frameProgress.TopMargin = frameThum.TopMargin + frameThum.Height / 2; |
| | | frameProgress.Height = AndroidView.LayoutParameters.Height - frameProgress.TopMargin; |
| | | btnProgressColor.LayoutParameters = frameProgress; |
| | | |
| | | if (dateTime == DateTime.MinValue) |
| | | { |
| | | if (ProgressChanged != null && beforValue != Progress) |
| | | { |
| | | dateTime = DateTime.Now; |
| | | delayDateTime = DateTime.Now; |
| | | ProgressChanged(this, beforValue = Progress); |
| | | } |
| | | } |
| | | else |
| | | { |
| | | //åå大äº500毫ç§çæ¶åæéç¥ |
| | | if (SleepTime < (DateTime.Now - dateTime).TotalMilliseconds) |
| | | { |
| | | dateTime = DateTime.Now; |
| | | delayDateTime = DateTime.Now; |
| | | if (ProgressChanged != null && beforValue != Progress) |
| | | { |
| | | ProgressChanged(this, beforValue = Progress); |
| | | } |
| | | } |
| | | } |
| | | } |
| | | |
| | | /// <summary> |
| | | /// éè¦éåçè§å¾ |
| | | /// </summary> |
| | | class VerticalSeekBarAndroidFrameLayout : Android.Widget.FrameLayout |
| | | { |
| | | View _view; |
| | | public VerticalSeekBarAndroidFrameLayout(Context context, View view) |
| | | : base(context) |
| | | { |
| | | _view = view; |
| | | Touch += (sender, e) => |
| | | { |
| | | if (_view != null) |
| | | { |
| | | _view.TouchEvent(e.Event); |
| | | } |
| | | }; |
| | | } |
| | | |
| | | /// <summary> |
| | | /// ææäºä»¶æ¬è§å¾å
¨é¨æ¶åï¼ä¸éç¥ç»åè§å¾ |
| | | /// </summary> |
| | | /// <returns><c>true</c>äºä»¶å·²ç»å¤ç<c>false</c>éè¦ç¶è§å¾å¤ç</returns> |
| | | /// <param name="ev">Ev.</param> |
| | | public override bool OnInterceptTouchEvent(MotionEvent ev) |
| | | { |
| | | //ä¸éè¦åè§å¾å¤çäºä»¶ï¼ææçäºä»¶èªå·±å¤ç |
| | | return true; |
| | | } |
| | | |
| | | float startPointX; |
| | | /// <summary> |
| | | /// æ§è¡OnInterceptTouchEventåOnTouchEvent |
| | | /// </summary> |
| | | /// <returns><c>true</c>äºä»¶å·²ç»å¤ç<c>false</c>äºä»¶æ²¡æå¤ç</returns> |
| | | /// <param name="e">E.</param> |
| | | public override bool DispatchTouchEvent(MotionEvent e) |
| | | { |
| | | switch (e.Action) |
| | | { |
| | | case MotionEventActions.Down: |
| | | startPointX = e.RawX; |
| | | requestParentDisallowInterceptTouchEvent(true); |
| | | break; |
| | | case MotionEventActions.Move: |
| | | if (20 < Math.Abs(e.RawX - startPointX)) |
| | | { |
| | | requestParentDisallowInterceptTouchEvent(false); |
| | | } |
| | | break; |
| | | case MotionEventActions.Up: |
| | | case MotionEventActions.Cancel: |
| | | requestParentDisallowInterceptTouchEvent(false); |
| | | break; |
| | | } |
| | | return base.DispatchTouchEvent(e); |
| | | } |
| | | /// <summary> |
| | | /// 设置ææç¶è§å¾ç¦æ¢æ¦æªäºä»¶ |
| | | /// </summary> |
| | | /// <param name="b">å¦æè®¾ç½®True表示ä¸è¦æ¦æªï¼å¦æè®¾ç½®ä¸ºFalse表示å¯ä»¥æ¦æª</param> |
| | | void requestParentDisallowInterceptTouchEvent(bool b) |
| | | { |
| | | var tempParent = Parent; |
| | | while (tempParent != null) |
| | | { //åè¯ç¶ç±»ä¸è¦æ¦æªè¿ä¸ªè§å¾çäºä»¶ |
| | | tempParent.RequestDisallowInterceptTouchEvent(b); |
| | | tempParent = tempParent.Parent; |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
New file |
| | |
| | | using System; |
| | | using System.Collections.Generic; |
| | | using System.Linq; |
| | | using System.Text; |
| | | using Android.App; |
| | | using Android.Content; |
| | | using Android.OS; |
| | | using Android.Runtime; |
| | | using Android.Views; |
| | | using Android.Widget; |
| | | using Android.Util; |
| | | using Android.Graphics; |
| | | |
| | | //using IO.Vov.Vitamio; |
| | | //using OnBufferingUpdateListener = IO.Vov.Vitamio.MediaPlayer.IOnBufferingUpdateListener; |
| | | //using OnCompletionListener = IO.Vov.Vitamio.MediaPlayer.IOnCompletionListener; |
| | | //using OnPreparedListener = IO.Vov.Vitamio.MediaPlayer.IOnPreparedListener; |
| | | namespace Shared |
| | | { |
| | | /// <summary> |
| | | /// Button æé® |
| | | /// </summary> |
| | | public class Video : View |
| | | { |
| | | |
| | | /// <summary> |
| | | /// å½åè§å¾ |
| | | /// </summary> |
| | | /// <value>The android button.</value> |
| | | // private AndroidSurfaceView surfaceView |
| | | // { |
| | | // get |
| | | // { |
| | | // return this.androidView as AndroidSurfaceView; |
| | | // } |
| | | // set |
| | | // { |
| | | // this.androidView = value; |
| | | // } |
| | | // } |
| | | |
| | | |
| | | public Video() |
| | | { |
| | | // this.surfaceView = new AndroidSurfaceView (Application.Activity); |
| | | } |
| | | |
| | | public void Start() |
| | | { |
| | | // this.surfaceView.Start (); |
| | | } |
| | | |
| | | public string URL |
| | | { |
| | | // get |
| | | // { |
| | | // return this.surfaceView.URL; |
| | | // } |
| | | set |
| | | { |
| | | //this.surfaceView.URL = value; |
| | | } |
| | | } |
| | | |
| | | public void Stop() |
| | | { |
| | | |
| | | } |
| | | |
| | | } |
| | | |
| | | // internal class AndroidSurfaceView:SurfaceView,OnBufferingUpdateListener, OnPreparedListener, MediaPlayer.IOnVideoSizeChangedListener, ISurfaceHolderCallback |
| | | // { |
| | | // private const string TAG = "MediaPlayerDemo"; |
| | | // private int mVideoWidth; |
| | | // private int mVideoHeight; |
| | | // private MediaPlayer mMediaPlayer; |
| | | // private ISurfaceHolder holder; |
| | | // |
| | | // private const string MEDIA = "media"; |
| | | // private const int LOCAL_AUDIO = 1; |
| | | // private const int STREAM_AUDIO = 2; |
| | | // private const int RESOURCES_AUDIO = 3; |
| | | // private const int LOCAL_VIDEO = 4; |
| | | // private const int STREAM_VIDEO = 5; |
| | | // private bool mIsVideoSizeKnown = false; |
| | | // private bool mIsVideoReadyToBePlayed = false; |
| | | // |
| | | // public string URL=""; |
| | | // |
| | | // public AndroidSurfaceView (Context context, IAttributeSet attrs, int defStyleAttr, int defStyleRes):base(context,attrs,defStyleAttr,defStyleRes) |
| | | // { |
| | | // |
| | | // } |
| | | // |
| | | // public AndroidSurfaceView (Context context, IAttributeSet attrs, int defStyleAttr):base(context,attrs,defStyleAttr){} |
| | | // |
| | | // public AndroidSurfaceView (Context context, IAttributeSet attrs):base(context,attrs){} |
| | | // |
| | | // public AndroidSurfaceView (Context context):base(context){ |
| | | // if (!LibsChecker.CheckVitamioLibs (Application.Activity)) { |
| | | // } |
| | | // |
| | | // holder = this.Holder; |
| | | // holder.AddCallback(this); |
| | | // holder.SetFormat(Format.Rgba8888); |
| | | // } |
| | | // |
| | | // protected AndroidSurfaceView (IntPtr javaReference, JniHandleOwnership transfer):base(javaReference,transfer){} |
| | | // |
| | | // private void initPlayer() |
| | | // { |
| | | // try { |
| | | // DoCleanUp (); |
| | | // |
| | | // mMediaPlayer = new MediaPlayer (Application.Activity); |
| | | // mMediaPlayer.SetDataSource (URL); |
| | | // mMediaPlayer.SetDisplay (holder); |
| | | // mMediaPlayer.PrepareAsync (); |
| | | // mMediaPlayer.SetOnBufferingUpdateListener (this); |
| | | //// mMediaPlayer.SetOnCompletionListener (this); |
| | | // mMediaPlayer.SetOnPreparedListener (this); |
| | | // mMediaPlayer.SetOnVideoSizeChangedListener (this); |
| | | // |
| | | // } catch (Exception e) { |
| | | // Log.Error (TAG, "error: " + e.Message, e); |
| | | // } |
| | | // } |
| | | // |
| | | // public virtual void OnBufferingUpdate(MediaPlayer arg0, int percent) |
| | | // { |
| | | // //Log.Info(TAG, "onBufferingUpdate percent:" + percent); |
| | | // |
| | | // } |
| | | // |
| | | // public virtual void OnVideoSizeChanged(MediaPlayer mp, int width, int height) |
| | | // { |
| | | // Log.Verbose(TAG, "onVideoSizeChanged called"); |
| | | // if (width == 0 || height == 0) |
| | | // { |
| | | // Log.Error(TAG, "invalid video width(" + width + ") or height(" + height + ")"); |
| | | // return; |
| | | // } |
| | | // mIsVideoSizeKnown = true; |
| | | // mVideoWidth = width; |
| | | // mVideoHeight = height; |
| | | // } |
| | | // |
| | | // public virtual void OnPrepared(MediaPlayer mediaplayer) |
| | | // { |
| | | // Log.Debug(TAG, "onPrepared called"); |
| | | // mIsVideoReadyToBePlayed = true; |
| | | // } |
| | | // |
| | | // public virtual void SurfaceChanged(ISurfaceHolder surfaceholder, int i, int j, int k) |
| | | // { |
| | | // Log.Debug(TAG, "surfaceChanged called"); |
| | | // } |
| | | // |
| | | // public virtual void SurfaceDestroyed(ISurfaceHolder surfaceholder) |
| | | // { |
| | | // Log.Debug(TAG, "surfaceDestroyed called"); |
| | | // } |
| | | // |
| | | // public virtual void SurfaceCreated(ISurfaceHolder holder) |
| | | // { |
| | | // Log.Debug(TAG, "surfaceCreated called"); |
| | | // initPlayer(); |
| | | // } |
| | | // |
| | | // public void Close() |
| | | // { |
| | | // ReleaseMediaPlayer(); |
| | | // DoCleanUp(); |
| | | // } |
| | | // |
| | | // private void ReleaseMediaPlayer() |
| | | // { |
| | | // if (mMediaPlayer != null) |
| | | // { |
| | | // mMediaPlayer.Release(); |
| | | // mMediaPlayer = null; |
| | | // } |
| | | // } |
| | | // |
| | | // private void DoCleanUp() |
| | | // { |
| | | // mVideoWidth = 0; |
| | | // mVideoHeight = 0; |
| | | // mIsVideoReadyToBePlayed = false; |
| | | // mIsVideoSizeKnown = false; |
| | | // } |
| | | // |
| | | // public void Start() |
| | | // { |
| | | // if (mIsVideoReadyToBePlayed && mIsVideoSizeKnown) { |
| | | // Log.Info (TAG, "startVideoPlayback"); |
| | | // holder.SetFixedSize (mVideoWidth, mVideoHeight); |
| | | // if (!b) { |
| | | // b = true; |
| | | // mMediaPlayer.Start (); |
| | | // } |
| | | // } |
| | | // } |
| | | // |
| | | // private bool b; |
| | | // |
| | | // public void SurfaceChanged (ISurfaceHolder holder, Format format, int width, int height) |
| | | // { |
| | | // Log.Debug(TAG, "surfaceChanged called"); |
| | | // } |
| | | // |
| | | // } |
| | | // |
| | | } |
| | | |
| | | |
New file |
| | |
| | | using System; |
| | | using Android.Graphics.Drawables; |
| | | using Android.Graphics; |
| | | using Android.Views.Animations; |
| | | using Android.Views; |
| | | using Java.Lang.Ref; |
| | | using static Shared.HDLUtils; |
| | | using Android.OS; |
| | | |
| | | namespace Shared |
| | | { |
| | | |
| | | /// <summary> |
| | | /// æ ¹è§å¾ |
| | | /// </summary> |
| | | internal class RootView : ViewGroup { } |
| | | /// <summary> |
| | | /// ææç±»çåºç±» |
| | | /// </summary> |
| | | public abstract class View |
| | | { |
| | | ~View() |
| | | { |
| | | //#if DEBUG |
| | | System.Console.WriteLine("=====" + GetType() + " " + Name); |
| | | //#endif |
| | | if (this is ViewGroup) |
| | | { |
| | | var viewGroup = this as ViewGroup; |
| | | if (viewGroup.realViewGroup != AndroidView) |
| | | { |
| | | //foreach (var view in viewGroup.viewList) |
| | | //{ |
| | | // view.AndroidView.Dispose(); |
| | | //} |
| | | viewGroup.realViewGroup?.Dispose(); |
| | | } |
| | | } |
| | | |
| | | AndroidView?.Dispose(); |
| | | } |
| | | |
| | | |
| | | /// <summary> |
| | | /// æ¯å¦éè¦æ´æ°æ§ä»¶ |
| | | /// </summary> |
| | | /// <value>The is need refresh.</value> |
| | | protected bool IsCanRefresh |
| | | { |
| | | get |
| | | { |
| | | View tempView = Parent; |
| | | while (tempView != null) |
| | | { |
| | | //æ ¹æ§ä»¶ï¼æ¾å°æ ¹æ§ä»¶å说æå·²ç»æåå å
¥äºç¶æ§ä»¶ |
| | | if (tempView.GetType() == typeof(RootView)) |
| | | { |
| | | return true; |
| | | } |
| | | tempView = tempView.Parent; |
| | | } |
| | | return false; |
| | | } |
| | | } |
| | | |
| | | internal virtual void ClearAllViewEvent() |
| | | { |
| | | //try |
| | | //{ |
| | | // lock (dimageCached) |
| | | // { |
| | | // foreach (var key in dimageCached.KeySet()) |
| | | // { |
| | | // var keyString = key.ToString(); |
| | | // if (keyString.StartsWith($"{GetHashCode()}_", StringComparison.Ordinal)) |
| | | // { |
| | | // dimageCached.Remove(keyString); |
| | | // System.Console.WriteLine("=====éæ¾å¾ç" + GetType() + " " + Name); |
| | | // (dimageCached.Get(keyString) as Drawable)?.Dispose(); |
| | | // break; |
| | | // } |
| | | // } |
| | | // } |
| | | //} |
| | | //catch { } |
| | | } |
| | | internal virtual void InitAllViewEvent() { } |
| | | |
| | | /// <summary> |
| | | /// å½å对åºçAndroidViewæ§ä»¶ |
| | | /// </summary> |
| | | public Android.Views.View AndroidView { get; set; } |
| | | |
| | | |
| | | /// <summary> |
| | | /// æ¯å¦ä½¿è½ |
| | | /// </summary> |
| | | /// <value>The enable.</value> |
| | | public virtual bool Enable |
| | | { |
| | | get |
| | | { |
| | | return AndroidView.Enabled; |
| | | } |
| | | set |
| | | { |
| | | AndroidView.Enabled = value; |
| | | } |
| | | } |
| | | |
| | | int height = LayoutParams.MatchParent; |
| | | /// <summary> |
| | | /// æ§ä»¶çé«åº¦ |
| | | /// </summary> |
| | | /// <value>The height.</value> |
| | | public virtual int Height |
| | | { |
| | | get |
| | | { |
| | | return AndroidView.LayoutParameters == null ? height : AndroidView.LayoutParameters.Height; |
| | | } |
| | | set |
| | | { |
| | | height = value; |
| | | |
| | | if (!IsCanRefresh) |
| | | return; |
| | | |
| | | var layoutParameters = AndroidView.LayoutParameters; |
| | | if (value == LayoutParams.MatchParent) |
| | | { |
| | | if (layoutParameters.Height != Parent.Height) |
| | | { |
| | | layoutParameters.Height = Parent.Height; |
| | | AndroidView.LayoutParameters = layoutParameters; |
| | | SizeChangeEventHandler?.Invoke(this, new Size(layoutParameters.Width, layoutParameters.Height)); |
| | | } |
| | | } |
| | | else |
| | | { |
| | | if (layoutParameters.Height != value) |
| | | { |
| | | layoutParameters.Height = value; |
| | | AndroidView.LayoutParameters = layoutParameters; |
| | | SizeChangeEventHandler?.Invoke(this, new Size(layoutParameters.Width, layoutParameters.Height)); |
| | | } |
| | | } |
| | | } |
| | | } |
| | | |
| | | int width = LayoutParams.MatchParent; |
| | | /// <summary> |
| | | /// æ§ä»¶å®½åº¦ |
| | | /// </summary> |
| | | /// <value>The width.</value> |
| | | public virtual int Width |
| | | { |
| | | get |
| | | { |
| | | return AndroidView.LayoutParameters == null ? width : AndroidView.LayoutParameters.Width; |
| | | } |
| | | set |
| | | { |
| | | width = value; |
| | | |
| | | if (!IsCanRefresh) |
| | | return; |
| | | |
| | | var layoutParameters = AndroidView.LayoutParameters; |
| | | if (value == LayoutParams.MatchParent) |
| | | { |
| | | if (layoutParameters.Width != Parent.Width) |
| | | { |
| | | layoutParameters.Width = Parent.Width; |
| | | AndroidView.LayoutParameters = layoutParameters; |
| | | SizeChangeEventHandler?.Invoke(this, new Size(layoutParameters.Width, layoutParameters.Height)); |
| | | } |
| | | } |
| | | else |
| | | { |
| | | if (layoutParameters.Width != value) |
| | | { |
| | | layoutParameters.Width = value; |
| | | AndroidView.LayoutParameters = layoutParameters; |
| | | SizeChangeEventHandler?.Invoke(this, new Size(layoutParameters.Width, layoutParameters.Height)); |
| | | } |
| | | } |
| | | } |
| | | } |
| | | |
| | | /// <summary> |
| | | /// å·æ°çé¢ |
| | | /// </summary> |
| | | public virtual void Refresh() |
| | | { |
| | | Width = width; |
| | | Height = height; |
| | | Gravity = gravity; |
| | | Animate = animate; |
| | | Radius = tempRadius; |
| | | } |
| | | |
| | | /// <summary> |
| | | /// åç§° |
| | | /// </summary> |
| | | /// <value>The name.</value> |
| | | public string Name { get; set; } |
| | | |
| | | int x; |
| | | /// <summary> |
| | | /// Xè½´åæ |
| | | /// </summary> |
| | | /// <value>The x.</value> |
| | | public int X |
| | | { |
| | | get |
| | | { |
| | | return (int)AndroidView.GetX(); |
| | | } |
| | | set |
| | | { |
| | | x = value; |
| | | |
| | | if (!IsCanRefresh) |
| | | { |
| | | return; |
| | | } |
| | | |
| | | if (Parent.GetType() == typeof(HorizontalScrolViewLayout)) |
| | | { |
| | | return; |
| | | } |
| | | else |
| | | { |
| | | AndroidView.SetX(value); |
| | | } |
| | | } |
| | | } |
| | | |
| | | int y; |
| | | /// <summary> |
| | | /// Yè½´åæ |
| | | /// </summary> |
| | | /// <value>The y.</value> |
| | | public int Y |
| | | { |
| | | get |
| | | { |
| | | return (int)AndroidView.GetY(); |
| | | } |
| | | set |
| | | { |
| | | y = value; |
| | | |
| | | if (!IsCanRefresh) |
| | | { |
| | | return; |
| | | } |
| | | |
| | | if (Parent.GetType() == typeof(VerticalScrolViewLayout)) |
| | | { |
| | | return; |
| | | } |
| | | else |
| | | { |
| | | AndroidView.SetY(value); |
| | | } |
| | | } |
| | | } |
| | | |
| | | Gravity gravity = Gravity.Frame; |
| | | /// <summary> |
| | | /// æ§ä»¶ç¸å¯¹äºç¶æ§ä»¶ç坹齿¹å¼ |
| | | /// </summary> |
| | | /// <value>The gravity.</value> |
| | | public Gravity Gravity |
| | | { |
| | | get |
| | | { |
| | | return gravity; |
| | | } |
| | | set |
| | | { |
| | | gravity = value; |
| | | if (!IsCanRefresh) |
| | | { |
| | | return; |
| | | } |
| | | |
| | | switch (value) |
| | | { |
| | | case Gravity.TopLeft: |
| | | X = 0; |
| | | Y = 0; |
| | | break; |
| | | case Gravity.TopCenter: |
| | | X = (Parent.Width - Width) / 2; |
| | | Y = 0; |
| | | break; |
| | | case Gravity.TopRight: |
| | | X = Parent.Width - Width; |
| | | Y = 0; |
| | | break; |
| | | case Gravity.CenterLeft: |
| | | X = 0; |
| | | Y = (Parent.Height - Height) / 2; |
| | | break; |
| | | case Gravity.Center: |
| | | X = (Parent.Width - Width) / 2; |
| | | Y = (Parent.Height - Height) / 2; |
| | | break; |
| | | case Gravity.CenterRight: |
| | | X = Parent.Width - Width; |
| | | Y = (Parent.Height - Height) / 2; |
| | | break; |
| | | case Gravity.BottomLeft: |
| | | X = 0; |
| | | Y = Parent.Height - Height; |
| | | break; |
| | | case Gravity.BottomCenter: |
| | | X = (Parent.Width - Width) / 2; |
| | | Y = Parent.Height - Height; |
| | | break; |
| | | case Gravity.BottomRight: |
| | | X = Parent.Width - Width; |
| | | Y = Parent.Height - Height; |
| | | break; |
| | | case Gravity.CenterVertical: |
| | | X = x; |
| | | Y = (Parent.Height - Height) / 2; |
| | | break; |
| | | case Gravity.CenterHorizontal: |
| | | X = (Parent.Width - Width) / 2; |
| | | Y = y; |
| | | break; |
| | | case Gravity.Frame: |
| | | X = x; |
| | | Y = y; |
| | | break; |
| | | } |
| | | } |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 左边线ä½ç½® |
| | | /// </summary> |
| | | /// <value>The bottom.</value> |
| | | public int Bottom |
| | | { |
| | | get |
| | | { |
| | | return Height + Y; |
| | | } |
| | | } |
| | | |
| | | /// <summary> |
| | | /// å³è¾¹çº¿ä½ç½® |
| | | /// </summary> |
| | | /// <value>The right.</value> |
| | | public int Right |
| | | { |
| | | get |
| | | { |
| | | return Width + X; |
| | | } |
| | | } |
| | | |
| | | /// <summary> |
| | | /// å½åçªå£å¤§å°åä½ç½® |
| | | /// </summary> |
| | | /// <value>The frame.</value> |
| | | public virtual Size Size |
| | | { |
| | | get |
| | | { |
| | | return new Size(Width, Height); |
| | | } |
| | | set |
| | | { |
| | | Width = value.Width; |
| | | Height = value.Height; |
| | | } |
| | | } |
| | | |
| | | /// <summary> |
| | | /// ç¶å®¹å¨ |
| | | /// </summary> |
| | | /// <value>The parent.</value> |
| | | public ViewGroup Parent { get; internal set; } |
| | | |
| | | /// <summary> |
| | | /// å¤çç¹å»ä»£ç |
| | | /// </summary> |
| | | /// <param name="sender">Sender.</param> |
| | | /// <param name="e">E.</param> |
| | | internal virtual bool TouchEvent(MotionEvent e) |
| | | { |
| | | if (!this.Enable) |
| | | { |
| | | return false; |
| | | } |
| | | switch (e.Action) |
| | | { |
| | | case MotionEventActions.Down: |
| | | isUp = false; |
| | | longClicked = false; |
| | | |
| | | MouseDownEventHandler?.Invoke(this, new MouseEventArgs { X = (int)e.GetX(), Y = (int)e.GetY() }); |
| | | if (MouseLongEventHandler != null) |
| | | { |
| | | try |
| | | { |
| | | if (thread != null && thread.IsAlive) |
| | | { |
| | | thread.Abort(); |
| | | } |
| | | thread = new System.Threading.Thread(() => |
| | | { |
| | | System.Threading.Thread.Sleep(800); |
| | | //System.Console.WriteLine("=====" + isUp); |
| | | if (!isUp) |
| | | { |
| | | longClicked = true; |
| | | Application.RunOnMainThread(() => |
| | | { |
| | | MouseLongEventHandler(this, new MouseEventArgs { X = (int)e.GetX(), Y = (int)e.GetY() }); |
| | | }); |
| | | } |
| | | }) |
| | | { IsBackground = true }; |
| | | thread.Start(); |
| | | } |
| | | catch { } |
| | | } |
| | | break; |
| | | case MotionEventActions.Move: |
| | | MouseMoveEventHandler?.Invoke(this, new MouseEventArgs { X = (int)e.GetX(), Y = (int)e.GetY() }); |
| | | break; |
| | | case MotionEventActions.Up: |
| | | isUp = true; |
| | | if (!longClicked && isTouchPointInView(AndroidView, e.RawX, e.RawY)) |
| | | { |
| | | MouseUpEventHandler?.Invoke(this, new MouseEventArgs { X = (int)e.GetX(), Y = (int)e.GetY() }); |
| | | } |
| | | break; |
| | | case MotionEventActions.Cancel: |
| | | isUp = true; |
| | | break; |
| | | } |
| | | return true; |
| | | } |
| | | |
| | | private bool isTouchPointInView(Android.Views.View targetView, float xAxis, float yAxis) |
| | | { |
| | | if (targetView == null) |
| | | { |
| | | return false; |
| | | } |
| | | var location = new int[2]; |
| | | targetView.GetLocationOnScreen(location); |
| | | int left = location[0]; |
| | | int top = location[1]; |
| | | int right = left + targetView.Width; |
| | | int bottom = top + targetView.Height; |
| | | if (yAxis >= top && yAxis <= bottom && xAxis >= left |
| | | && xAxis <= right) |
| | | { |
| | | return true; |
| | | } |
| | | return false; |
| | | } |
| | | |
| | | bool isUp ; |
| | | bool longClicked; |
| | | |
| | | /// <summary> |
| | | /// ç¹å»æä¸äºä»¶ |
| | | /// </summary> |
| | | public EventHandler<MouseEventArgs> MouseDownEventHandler; |
| | | |
| | | /// <summary> |
| | | /// æ§ä»¶ä¸ç§»å¨äºä»¶ |
| | | /// </summary> |
| | | public EventHandler<MouseEventArgs> MouseMoveEventHandler; |
| | | |
| | | /// <summary> |
| | | /// ç¹å»å¼¹èµ·äºä»¶ |
| | | /// </summary> |
| | | public EventHandler<MouseEventArgs> MouseUpEventHandler; |
| | | |
| | | System.Threading.Thread thread; |
| | | /// <summary> |
| | | /// é¿æç¹å»äºä»¶ |
| | | /// </summary> |
| | | public EventHandler<MouseEventArgs> MouseLongEventHandler; |
| | | |
| | | |
| | | /// <summary> |
| | | /// 大å°ååäºä»¶ |
| | | /// </summary> |
| | | public EventHandler<Size> SizeChangeEventHandler; |
| | | |
| | | /// <summary> |
| | | /// å°æ§å¶ç§»å°æå |
| | | /// </summary> |
| | | public virtual void BringToFront() |
| | | { |
| | | AndroidView.BringToFront(); |
| | | } |
| | | |
| | | Animate animate = Animate.None; |
| | | /// <summary> |
| | | /// å¨ç»æ¹å¼ |
| | | /// </summary> |
| | | /// <value>The animate.</value> |
| | | public Animate Animate |
| | | { |
| | | get |
| | | { |
| | | return animate; |
| | | } |
| | | set |
| | | { |
| | | animate = value; |
| | | if (!IsCanRefresh) |
| | | { |
| | | return; |
| | | } |
| | | AndroidView.ClearAnimation(); |
| | | |
| | | switch (animate) |
| | | { |
| | | case Animate.DownToUp: |
| | | { |
| | | AndroidView.Animation = new TranslateAnimation( |
| | | Dimension.RelativeToSelf, 0, |
| | | Dimension.RelativeToSelf, 0, |
| | | Dimension.RelativeToSelf, 1.0f, |
| | | Dimension.RelativeToSelf, 0) |
| | | { Duration = 500 }; // 13828497568 |
| | | AndroidView.Animation.StartNow(); |
| | | } |
| | | break; |
| | | case Animate.UpToDown: |
| | | { |
| | | AndroidView.Animation = new TranslateAnimation( |
| | | Dimension.RelativeToSelf, 0, |
| | | Dimension.RelativeToSelf, 0, |
| | | Dimension.RelativeToSelf, -1.0f, |
| | | Dimension.RelativeToSelf, 0) |
| | | { Duration = 500 }; |
| | | AndroidView.Animation.StartNow(); |
| | | } |
| | | break; |
| | | case Animate.LeftToRight: |
| | | { |
| | | AndroidView.Animation = new TranslateAnimation( |
| | | Dimension.RelativeToSelf, -1.0f, |
| | | Dimension.RelativeToSelf, 0, |
| | | Dimension.RelativeToSelf, 0f, |
| | | Dimension.RelativeToSelf, 0) |
| | | { Duration = 500 }; |
| | | AndroidView.Animation.StartNow(); |
| | | } |
| | | break; |
| | | case Animate.RightToLeft: |
| | | { |
| | | AndroidView.Animation = new TranslateAnimation( |
| | | Dimension.RelativeToSelf, 1.0f, |
| | | Dimension.RelativeToSelf, 0, |
| | | Dimension.RelativeToSelf, 0f, |
| | | Dimension.RelativeToSelf, 0) |
| | | { Duration = 500 }; |
| | | AndroidView.Animation.StartNow(); |
| | | } |
| | | break; |
| | | case Animate.Rotation: |
| | | { |
| | | AndroidView.Animation = new RotateAnimation( |
| | | 0, |
| | | 359, |
| | | X + Width / 2.0f, |
| | | Y + Height / 2.0f |
| | | ) |
| | | { Duration = 16000, RepeatCount = -1 }; |
| | | AndroidView.Animation.StartNow(); |
| | | } |
| | | break; |
| | | } |
| | | |
| | | } |
| | | } |
| | | |
| | | static Java.Util.HashMap dimageCached = new Java.Util.HashMap(); |
| | | |
| | | /// <summary> |
| | | /// è®¾å¤æ§ä»¶èæ¯å¾ |
| | | /// </summary> |
| | | /// <param name="filePath"></param> |
| | | protected bool Background(string filePath) |
| | | { |
| | | try |
| | | { |
| | | var drawable = getDrawable(filePath); |
| | | if (this.GetType() == typeof(ImageView)) |
| | | { |
| | | (AndroidView as AndroidImageView).SetImageDrawable(drawable); |
| | | } |
| | | else |
| | | { |
| | | AndroidView.Background = drawable; |
| | | } |
| | | |
| | | if (null != drawable) |
| | | { |
| | | return true; |
| | | } |
| | | } |
| | | catch { } |
| | | return false; |
| | | } |
| | | |
| | | protected bool Background(string filePath, Android.Views.View view) |
| | | { |
| | | AndroidView.Background = getDrawable(filePath); |
| | | |
| | | if (null == view.Background) |
| | | { |
| | | return false; |
| | | } |
| | | else |
| | | { |
| | | |
| | | return true; |
| | | } |
| | | } |
| | | |
| | | protected Drawable Bytes2Drawable(byte[] b) |
| | | { |
| | | var bitmap = Bytes2Bitmap(b); |
| | | return bitmap2Drawable(bitmap); |
| | | } |
| | | |
| | | protected Drawable bitmap2Drawable(Bitmap bitmap) |
| | | { |
| | | return new BitmapDrawable(bitmap); |
| | | } |
| | | |
| | | |
| | | // byte[]è½¬æ¢æBitmap |
| | | protected Bitmap Bytes2Bitmap(byte[] b) |
| | | { |
| | | if (b.Length != 0) |
| | | { |
| | | return BitmapFactory.DecodeByteArray(b, 0, b.Length); |
| | | } |
| | | return null; |
| | | } |
| | | |
| | | Drawable getDrawable(string filePath) |
| | | { |
| | | try |
| | | { |
| | | if (filePath == null) |
| | | { |
| | | return null; |
| | | } |
| | | var newFilePath = IO.FileUtils.GetImageFilePath(filePath); |
| | | if (string.IsNullOrEmpty(newFilePath)) |
| | | { |
| | | AndroidView.Background = null; |
| | | return null; |
| | | } |
| | | |
| | | var mappingPath = "";// $"{this.GetHashCode()}_"; |
| | | if (AndroidView.LayoutParameters != null) |
| | | { |
| | | mappingPath += AndroidView.LayoutParameters.Width + "-" + AndroidView.LayoutParameters.Height + "-"; |
| | | } |
| | | mappingPath += newFilePath; |
| | | |
| | | |
| | | |
| | | //lock (dimageCached) |
| | | { |
| | | if (dimageCached.ContainsKey(mappingPath) && dimageCached.Get(mappingPath) != null) |
| | | { |
| | | return (Drawable)dimageCached.Get(mappingPath); |
| | | } |
| | | } |
| | | //System.Console.WriteLine(dimageCached.Size() + " "); |
| | | var tempBitmapUtiles = AndroidDrawableUtiles.GetAndroidDrawableUtiles(newFilePath, Width, Height); |
| | | |
| | | //å è½½äºæ¬¡ |
| | | if (null == tempBitmapUtiles) |
| | | { |
| | | tempBitmapUtiles = AndroidDrawableUtiles.GetAndroidDrawableUtiles(newFilePath, Width, Height); |
| | | } |
| | | |
| | | //两次å è½½å¾çé½å¤±è´¥ï¼ç´æ¥è¿å |
| | | if (null == tempBitmapUtiles) |
| | | { |
| | | AndroidView.Background = null; |
| | | return null; |
| | | } |
| | | //if (mappingPath.Contains("/Room/") || mappingPath.Contains("/Scene/")) |
| | | //{ |
| | | // return tempBitmapUtiles.Drawable; |
| | | //} |
| | | //lock (dimageCached) |
| | | { |
| | | try |
| | | { |
| | | if (dimageCached.ContainsKey(mappingPath)) |
| | | { |
| | | dimageCached.Remove(mappingPath); |
| | | dimageCached.Put(mappingPath, tempBitmapUtiles.Drawable); |
| | | } |
| | | else |
| | | { |
| | | dimageCached.Put(mappingPath, tempBitmapUtiles.Drawable); |
| | | } |
| | | return tempBitmapUtiles.Drawable; |
| | | } |
| | | catch |
| | | { |
| | | return null; |
| | | } |
| | | } |
| | | } |
| | | catch { |
| | | return null; |
| | | } |
| | | } |
| | | |
| | | |
| | | /// <summary> |
| | | /// å
è¾¹è· |
| | | /// </summary> |
| | | /// <value>The padding.</value> |
| | | public virtual Padding Padding |
| | | { |
| | | get; |
| | | set; |
| | | } |
| | | |
| | | /// <summary> |
| | | /// æ¹ä¾¿å¼åè
å¼å |
| | | /// </summary> |
| | | public object Tag; |
| | | |
| | | System.Collections.Generic.Dictionary<string, object> tag; |
| | | /// <summary> |
| | | /// å¢å é®å¼å¯¹ |
| | | /// </summary> |
| | | /// <param name="key">Key.</param> |
| | | /// <param name="value">Value.</param> |
| | | public void AddTag(string key, object value) |
| | | { |
| | | if (tag == null) |
| | | { |
| | | tag = new System.Collections.Generic.Dictionary<string, object>(); |
| | | } |
| | | tag.Remove(key); |
| | | tag.Add(key, value); |
| | | } |
| | | |
| | | /// <summary> |
| | | /// å 餿å®é®å¼å¯¹ |
| | | /// </summary> |
| | | /// <param name="key">Key.</param> |
| | | public void RemoveTag(string key) |
| | | { |
| | | if (tag == null) |
| | | { |
| | | return; |
| | | } |
| | | tag.Remove(key); |
| | | } |
| | | |
| | | /// <summary> |
| | | /// æ ¹æ®é®è·åå¼ |
| | | /// </summary> |
| | | /// <returns>The tag by key.</returns> |
| | | /// <param name="key">Key.</param> |
| | | public object GetTagByKey(string key) |
| | | { |
| | | if (tag == null) |
| | | { |
| | | return null; |
| | | } |
| | | object value; |
| | | tag.TryGetValue(key, out value); |
| | | return value; |
| | | } |
| | | |
| | | |
| | | |
| | | /// <summary> |
| | | /// å
¨é¨å é¤Tag |
| | | /// </summary> |
| | | /// <returns>The tag.</returns> |
| | | public void ClearTag() |
| | | { |
| | | if (tag != null) |
| | | { |
| | | tag.Clear(); |
| | | } |
| | | } |
| | | |
| | | /// <summary> |
| | | /// æ¯å¦æ¾ç¤º |
| | | /// </summary> |
| | | /// <value><c>true</c> if visible; otherwise, <c>false</c>.</value> |
| | | public bool Visible |
| | | { |
| | | get |
| | | { |
| | | if (AndroidView.Visibility == Android.Views.ViewStates.Visible) |
| | | { |
| | | return true; |
| | | } |
| | | else |
| | | { |
| | | return false; |
| | | } |
| | | } |
| | | set |
| | | { |
| | | if (value) |
| | | { |
| | | AndroidView.Visibility = Android.Views.ViewStates.Visible; |
| | | } |
| | | else |
| | | { |
| | | AndroidView.Visibility = Android.Views.ViewStates.Invisible; |
| | | } |
| | | } |
| | | } |
| | | |
| | | /// <summary> |
| | | /// ä»ç¶è§å¾ä¸ç§»é¤ |
| | | /// </summary> |
| | | public virtual void RemoveFromParent() |
| | | { |
| | | if (Parent == null) |
| | | { |
| | | return; |
| | | } |
| | | Parent.Remove(this); |
| | | } |
| | | |
| | | /// <summary> |
| | | /// éæåº¦è®¾ç½® |
| | | /// </summary> |
| | | /// <value>The alpha.</value> |
| | | public float Alpha |
| | | { |
| | | get |
| | | { |
| | | return AndroidView.Alpha; |
| | | } |
| | | set |
| | | { |
| | | AndroidView.Alpha = value; |
| | | } |
| | | } |
| | | |
| | | uint backgroundColor; |
| | | /// <summary> |
| | | /// èæ¯é¢è² |
| | | /// </summary> |
| | | /// <value>The color of the background.</value> |
| | | public virtual uint BackgroundColor |
| | | { |
| | | get |
| | | { |
| | | return backgroundColor; |
| | | } |
| | | set |
| | | { |
| | | backgroundColor = value; |
| | | |
| | | if (this.GetType() != typeof(ImageView)) |
| | | { |
| | | if (AndroidView.Background == null || AndroidView.Background.GetType() != typeof(GradientDrawable)) |
| | | { |
| | | AndroidView.Background = new Android.Graphics.Drawables.GradientDrawable(); |
| | | } |
| | | |
| | | var gradientDrawable = (GradientDrawable)AndroidView.Background; |
| | | //gradientDrawable.SetCornerRadius(DensityUtil.Dip2Px(Radius)); |
| | | |
| | | if (IsSetAloneRadius) |
| | | { |
| | | gradientDrawable.SetCornerRadii(GetCornerRadii()); |
| | | } |
| | | else { |
| | | gradientDrawable.SetCornerRadius(DensityUtil.Dip2Px(Radius)); |
| | | } |
| | | |
| | | |
| | | byte r, g, b, a; |
| | | r = (byte)(BorderColor / 256 / 256 % 256); |
| | | g = (byte)(BorderColor / 256 % 256); |
| | | b = (byte)(BorderColor % 256); |
| | | a = (byte)(BorderColor / 256 / 256 / 256 % 256); |
| | | gradientDrawable.SetStroke((int)BorderWidth, Android.Graphics.Color.Argb(a, r, g, b)); |
| | | |
| | | r = (byte)(backgroundColor / 256 / 256 % 256); |
| | | g = (byte)(backgroundColor / 256 % 256); |
| | | b = (byte)(backgroundColor % 256); |
| | | a = (byte)(backgroundColor / 256 / 256 / 256 % 256); |
| | | gradientDrawable.SetColor(Android.Graphics.Color.Argb(a, r, g, b).ToArgb()); |
| | | } |
| | | } |
| | | } |
| | | |
| | | |
| | | /// <summary> |
| | | /// è·åæå®åè§å±æ§ |
| | | /// </summary> |
| | | /// <value>The corner.</value> |
| | | private float[] GetCornerRadii() |
| | | { |
| | | float[] mCornerRadius = new float[8]; |
| | | mCornerRadius[0] = topLeftRadius; |
| | | mCornerRadius[1] = topLeftRadius; |
| | | |
| | | mCornerRadius[2] = topRightRadius; |
| | | mCornerRadius[3] = topRightRadius; |
| | | |
| | | mCornerRadius[4] = bottomRightRadius; |
| | | mCornerRadius[5] = bottomRightRadius; |
| | | |
| | | mCornerRadius[6] = bottomLeftRadius; |
| | | mCornerRadius[7] = bottomLeftRadius; |
| | | return mCornerRadius; |
| | | } |
| | | |
| | | //æ¯å¦åç¬è®¾ç½®åè§ |
| | | private bool IsSetAloneRadius; |
| | | //4个åè§åå«å¯¹åºçå¼ |
| | | float topLeftRadius, topRightRadius, bottomLeftRadius, bottomRightRadius; |
| | | float mAloneRadius; |
| | | float mRadiusId; |
| | | /// <summary> |
| | | /// æå®ä½ç½® 设置ç¸åçåè§ |
| | | /// </summary> |
| | | public void SetCornerWithSameRadius(float mRadius, int mSetID) |
| | | { |
| | | try |
| | | { |
| | | mAloneRadius = DensityUtil.Dip2Px(mRadius); |
| | | IsSetAloneRadius = true; |
| | | mRadiusId = mSetID; |
| | | topLeftRadius = (mSetID & 1) == 1 ? mAloneRadius : 0; |
| | | topRightRadius = (mSetID >> 1 & 1) == 1 ? mAloneRadius : 0; |
| | | bottomLeftRadius = (mSetID >> 2 & 1) == 1 ? mAloneRadius : 0; |
| | | bottomRightRadius = (mSetID >> 3 & 1) == 1 ? mAloneRadius : 0; |
| | | |
| | | BackgroundColor = backgroundColor; |
| | | } |
| | | catch |
| | | { |
| | | } |
| | | } |
| | | |
| | | internal uint radius, tempRadius; |
| | | /// <summary> |
| | | /// åè§å¤§å° |
| | | /// </summary> |
| | | /// <value>The corner.</value> |
| | | public virtual uint Radius |
| | | { |
| | | get |
| | | { |
| | | return radius; |
| | | } |
| | | set |
| | | { |
| | | IsSetAloneRadius = false; |
| | | tempRadius = value; |
| | | if (!IsCanRefresh || Radius == value) |
| | | { |
| | | return; |
| | | } |
| | | radius = value; |
| | | BackgroundColor = backgroundColor; |
| | | } |
| | | } |
| | | |
| | | uint borderWidth; |
| | | /// <summary> |
| | | /// è¾¹æ¡çº¿å¤§å° |
| | | /// </summary> |
| | | /// <value>The width of the border.</value> |
| | | public uint BorderWidth |
| | | { |
| | | get |
| | | { |
| | | return borderWidth; |
| | | } |
| | | set |
| | | { |
| | | borderWidth = value; |
| | | |
| | | BackgroundColor = backgroundColor; |
| | | } |
| | | } |
| | | |
| | | uint borderColor = 0xFFCCCCCC; |
| | | /// <summary> |
| | | /// è¾¹æ¡é¢è² |
| | | /// </summary> |
| | | /// <value>The color of the border.</value> |
| | | public uint BorderColor |
| | | { |
| | | get |
| | | { |
| | | return borderColor; |
| | | } |
| | | set |
| | | { |
| | | borderColor = value; |
| | | BackgroundColor = backgroundColor; |
| | | } |
| | | } |
| | | |
| | | protected int Dip2Px(float dpValue) |
| | | { |
| | | float scale = Application.Activity.Resources.DisplayMetrics.Density; |
| | | return (int)(dpValue * scale + 0.5f); |
| | | } |
| | | |
| | | /// <summary> |
| | | /// æè½¬View |
| | | /// </summary> |
| | | /// <value>æè½¬è§åº¦</value> |
| | | public void SetRotation(float mRotation) |
| | | { |
| | | |
| | | AndroidView.Rotation = mRotation; |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 设置é´å½±ææ |
| | | /// </summary> |
| | | /// <value>æ¯å¦æ¾ç¤ºé´å½±</value> |
| | | public void SetViewShadow(bool bShow, float mOffsetY = 5.0f) |
| | | { |
| | | if((int)Build.VERSION.SdkInt >= 21) |
| | | { |
| | | AndroidView.TranslationZ = bShow ? Dip2Px(mOffsetY) : 0; |
| | | } |
| | | |
| | | } |
| | | } |
| | | |
| | | |
| | | public class Size |
| | | { |
| | | /// <summary> |
| | | /// Initializes a new instance of the <see cref="Shared.Frame"/> class. |
| | | /// </summary> |
| | | /// <param name="x">Xè½´</param> |
| | | /// <param name="y">Yè½´</param> |
| | | /// <param name="width">宽度</param> |
| | | /// <param name="height">é«åº¦</param> |
| | | public Size(int width, int height) |
| | | { |
| | | Width = width; |
| | | Height = height; |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 宽度 |
| | | /// </summary> |
| | | public int Width |
| | | { |
| | | get; |
| | | set; |
| | | } |
| | | /// <summary> |
| | | /// é«åº¦ |
| | | /// </summary> |
| | | public int Height |
| | | { |
| | | get; |
| | | set; |
| | | } |
| | | |
| | | |
| | | |
| | | } |
| | | |
| | | /// <summary> |
| | | /// å
è¾¹è· |
| | | /// </summary> |
| | | public class Padding |
| | | { |
| | | public Padding(int top, int left, int bottom, int right) |
| | | { |
| | | Top = top; |
| | | Left = left; |
| | | Bottom = bottom; |
| | | Right = right; |
| | | } |
| | | /// <summary> |
| | | /// é¡¶é¨ |
| | | /// </summary> |
| | | public int Top |
| | | { |
| | | get; |
| | | set; |
| | | } |
| | | /// <summary> |
| | | /// 左边 |
| | | /// </summary> |
| | | public int Left |
| | | { |
| | | get; |
| | | set; |
| | | } |
| | | /// <summary> |
| | | /// åºé¨ |
| | | /// </summary> |
| | | public int Bottom |
| | | { |
| | | get; |
| | | set; |
| | | } |
| | | /// <summary> |
| | | /// å³è¾¹ |
| | | /// </summary> |
| | | public int Right |
| | | { |
| | | get; |
| | | set; |
| | | } |
| | | } |
| | | |
| | | internal class AndroidDrawableUtiles |
| | | { |
| | | /// <summary> |
| | | /// å¾ç对象 |
| | | /// </summary> |
| | | public Drawable Drawable; |
| | | |
| | | /// <summary> |
| | | /// å¾ççé«åº¦ |
| | | /// </summary> |
| | | public int Height; |
| | | /// <summary> |
| | | /// å¾çç宽度 |
| | | /// </summary> |
| | | public int Width; |
| | | |
| | | /// <summary> |
| | | /// Initializes a new instance of the <see cref="Shared.AndroidDrawableUtiles"/> class. |
| | | /// </summary> |
| | | /// <param name="bitmapDrawable">Bitmap drawable.</param> |
| | | /// <param name="height">Height.</param> |
| | | /// <param name="width">Width.</param> |
| | | public AndroidDrawableUtiles(Drawable bitmapDrawable, int height, int width) |
| | | { |
| | | Drawable = bitmapDrawable; |
| | | Height = height; |
| | | Width = width; |
| | | } |
| | | |
| | | |
| | | |
| | | |
| | | static Bitmap readBitmapFromFileDescriptor(string filePath, int width, int height) |
| | | { |
| | | try |
| | | { |
| | | var fis = new Java.IO.FileInputStream(filePath); |
| | | var options = new BitmapFactory.Options(); |
| | | options.InJustDecodeBounds = true; |
| | | BitmapFactory.DecodeFileDescriptor(fis.FD, null, options); |
| | | float srcWidth = options.OutWidth; |
| | | float srcHeight = options.OutHeight; |
| | | int inSampleSize = 1; |
| | | |
| | | if (srcHeight > height || srcWidth > width) |
| | | { |
| | | if (srcWidth > srcHeight) |
| | | { |
| | | inSampleSize = (int)Math.Round(srcHeight / height); |
| | | } |
| | | else |
| | | { |
| | | inSampleSize = (int)Math.Round(srcWidth / width); |
| | | } |
| | | } |
| | | |
| | | options.InJustDecodeBounds = false; |
| | | options.InSampleSize = inSampleSize; |
| | | |
| | | return (Bitmap)new SoftReference(BitmapFactory.DecodeFileDescriptor(fis.FD, null, options)).Get(); |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | } |
| | | return null; |
| | | } |
| | | |
| | | public static AndroidDrawableUtiles GetAndroidDrawableUtiles(string filePath, int width, int height) |
| | | { |
| | | var bitmap = readBitmapFromFileDescriptor(filePath, width, height); |
| | | //BitmapFactory.Options options = new BitmapFactory.Options(); |
| | | //options.InJustDecodeBounds = true; |
| | | //BitmapFactory.DecodeFile(filePath, options); |
| | | ////å¾çä¸åå¨ï¼ç´æ¥è¿å |
| | | //if (0 == options.OutWidth || 0 == options.OutHeight) |
| | | //{ |
| | | // System.Console.WriteLine(filePath+"æ¾ä¸å°"); |
| | | // return null; |
| | | //} |
| | | //options.InSampleSize = getFitInSampleSize(width, height, options); |
| | | //options.InJustDecodeBounds = false; |
| | | //var bitmap = BitmapFactory.DecodeFile(filePath, options); |
| | | //var drawable = new BitmapDrawable(bitmap); |
| | | //if (drawable.Bitmap != bitmap && !bitmap.IsRecycled) |
| | | //{ |
| | | // System.Console.WriteLine("éæ¾å¾çèµæºï¼" + filePath); |
| | | // bitmap.Recycle(); |
| | | //} |
| | | //var drawable = new BitmapDrawable(bitmap); |
| | | if (bitmap == null) |
| | | { |
| | | return new AndroidDrawableUtiles(null, bitmap.Width, bitmap.Height); |
| | | } |
| | | else |
| | | { |
| | | return new AndroidDrawableUtiles((BitmapDrawable)new SoftReference(new BitmapDrawable(bitmap)).Get(), bitmap.Width, bitmap.Height); |
| | | } |
| | | } |
| | | static int getFitInSampleSize(int reqWidth, int reqHeight, BitmapFactory.Options options) |
| | | { |
| | | int inSampleSize = 1; |
| | | if (options.OutWidth > reqWidth || options.OutHeight > reqHeight) |
| | | { |
| | | int widthRatio = (int)Math.Round(options.OutWidth * 1.0 / reqWidth); |
| | | int heightRatio = (int)Math.Round(options.OutHeight * 1.0 / reqHeight); |
| | | inSampleSize = Math.Min(widthRatio, heightRatio); |
| | | } |
| | | return inSampleSize; |
| | | } |
| | | } |
| | | |
| | | /// <summary> |
| | | /// ç¹å»æ¶åºæ¬åæ° |
| | | /// </summary> |
| | | public class MouseEventArgs : EventArgs |
| | | { |
| | | /// <summary> |
| | | /// Xåæ |
| | | /// </summary> |
| | | public float X; |
| | | /// <summary> |
| | | /// Yåæ |
| | | /// </summary> |
| | | public float Y; |
| | | } |
| | | |
| | | public class AndroidView |
| | | { |
| | | //æ¯å¦æ¯æ´»å¨ç¶æ |
| | | public static bool IsLive(Android.Views.View view) |
| | | { |
| | | return view.Enabled && view.Visibility == ViewStates.Visible && 0 < view.Alpha; |
| | | } |
| | | } |
| | | } |
New file |
| | |
| | | |
| | | 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--; |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | | |
| | | |
New file |
| | |
| | | using System; |
| | | using Android.Runtime; |
| | | using Android.Views; |
| | | using Com.Hdl.Widget; |
| | | |
| | | namespace Shared |
| | | { |
| | | |
| | | /// <summary> |
| | | /// HDLWaveSeekBar 波浪æ»å¨æ§ä»¶ |
| | | /// </summary> |
| | | public class WaveSeekBar : View |
| | | { |
| | | /// <summary> |
| | | /// å½åè§å¾ |
| | | /// </summary> |
| | | /// <value>The HDLWaveSeekBar.</value> |
| | | HDLWaveSeekBar mHDLWaveSeekBar |
| | | { |
| | | get |
| | | { |
| | | return AndroidView as HDLWaveSeekBar; |
| | | } |
| | | set |
| | | { |
| | | AndroidView = value; |
| | | } |
| | | } |
| | | |
| | | /// <summary> |
| | | /// æé 彿° |
| | | /// </summary> |
| | | public WaveSeekBar() |
| | | { |
| | | mHDLWaveSeekBar = new HDLWaveSeekBar(Application.Activity); |
| | | mOnProgressChangeListener = new OnProgressChangeListener(this); |
| | | mHDLWaveSeekBar.SetOnProgressChangeListener(mOnProgressChangeListener); |
| | | } |
| | | |
| | | //internal static ProgressChangeListener:Com.Hdl.Widget.HDLWaveSeekBar.IOnProgressChangeListener(){ |
| | | |
| | | |
| | | //} |
| | | |
| | | /// <summary> |
| | | /// è¿åº¦å¼æ¾ç¤ºåä½ |
| | | /// </summary> |
| | | /// <value>åä½å符</value> |
| | | public String ProgressBarUnitSring |
| | | { |
| | | set |
| | | { |
| | | mHDLWaveSeekBar.SetProgressBarUnitSring(value); |
| | | } |
| | | } |
| | | |
| | | /// <summary> |
| | | /// è¿åº¦å¼æå¤§å¼ |
| | | /// </summary> |
| | | /// <value>æå¤§å¼</value> |
| | | public int MaxValue |
| | | { |
| | | set |
| | | { |
| | | mHDLWaveSeekBar.SetMaxValue(value); |
| | | } |
| | | } |
| | | |
| | | /// <summary> |
| | | /// è¿åº¦å¼æå°å¼ |
| | | /// </summary> |
| | | /// <value>æå°å¼</value> |
| | | public int MinValue |
| | | { |
| | | set |
| | | { |
| | | mHDLWaveSeekBar.SetMinValue(value); |
| | | } |
| | | } |
| | | |
| | | /// <summary> |
| | | /// å½åè¿åº¦å¼ |
| | | /// </summary> |
| | | /// <value>è¿åº¦å¼</value> |
| | | public int Progress |
| | | { |
| | | set |
| | | { |
| | | mHDLWaveSeekBar.Progress = value; |
| | | } |
| | | |
| | | get |
| | | { |
| | | |
| | | return mHDLWaveSeekBar.Progress; |
| | | } |
| | | } |
| | | |
| | | |
| | | |
| | | /// <summary> |
| | | /// å½åè¿åº¦å¼æ¾ç¤ºçæåé¢è² |
| | | /// </summary> |
| | | /// <value>æåé¢è²</value> |
| | | public uint ProgressTextColor |
| | | { |
| | | set |
| | | { |
| | | |
| | | byte r, g, b, a; |
| | | r = (byte)(value / 256 / 256 % 256); |
| | | g = (byte)(value / 256 % 256); |
| | | b = (byte)(value % 256); |
| | | a = (byte)(value / 256 / 256 / 256 % 256); |
| | | |
| | | mHDLWaveSeekBar.SetProgressTextColor(Android.Graphics.Color.Argb(a, r, g, b)); |
| | | |
| | | |
| | | |
| | | } |
| | | } |
| | | |
| | | /// <summary> |
| | | /// å½åè¿åº¦å¼æ¾ç¤ºçæåå¤§å° |
| | | /// </summary> |
| | | /// <value>æå大å°</value> |
| | | public int ProgressTextSize |
| | | { |
| | | set => mHDLWaveSeekBar.SetProgressTextSize(value); |
| | | } |
| | | |
| | | /// <summary> |
| | | /// æ¯å¦å¯ä»¥æ»å¨ |
| | | /// </summary> |
| | | /// <value>æ¯å¦å¯ä»¥æ»å¨</value> |
| | | public bool IsClickable |
| | | { |
| | | set |
| | | { |
| | | mHDLWaveSeekBar.SetIsClickable(value); |
| | | } |
| | | } |
| | | |
| | | /// <summary> |
| | | /// æ¯å¦å¯ä»¥æ»å¨ |
| | | /// </summary> |
| | | /// <value>æ¯å¦å¯ä»¥æ»å¨</value> |
| | | public bool IsProgressTextShow |
| | | { |
| | | set |
| | | { |
| | | mHDLWaveSeekBar.SetProgressTextShow(value); |
| | | |
| | | } |
| | | } |
| | | |
| | | |
| | | /// <summary> |
| | | /// èæ¯è¾¹æ¡å®½åº¦ |
| | | /// </summary> |
| | | /// <value>åå¾</value> |
| | | public int WaveBorderWidth |
| | | { |
| | | set |
| | | { |
| | | mHDLWaveSeekBar.SetBorderWidth(value); |
| | | } |
| | | } |
| | | |
| | | /// <summary> |
| | | /// åè§ |
| | | /// </summary> |
| | | /// <value>åè§</value> |
| | | public int CornerRadius |
| | | { |
| | | set |
| | | { |
| | | mHDLWaveSeekBar.SetCornerRadius(value); |
| | | } |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 波浪è¿åº¦é¢è² |
| | | /// </summary> |
| | | /// <value>波浪è¿åº¦é¢è²</value> |
| | | public uint WaveColor |
| | | { |
| | | set |
| | | { |
| | | byte r, g, b, a; |
| | | r = (byte)(value / 256 / 256 % 256); |
| | | g = (byte)(value / 256 % 256); |
| | | b = (byte)(value % 256); |
| | | a = (byte)(value / 256 / 256 / 256 % 256); |
| | | |
| | | mHDLWaveSeekBar.SetWaveColor(Android.Graphics.Color.Argb(a, r, g, b)); |
| | | } |
| | | } |
| | | |
| | | |
| | | /// <summary> |
| | | /// èæ¯è¾¹æ¡é¢è² |
| | | /// </summary> |
| | | /// <value>èæ¯è¾¹æ¡é¢è²</value> |
| | | public uint WaveBorderColor |
| | | { |
| | | set |
| | | { |
| | | byte r, g, b, a; |
| | | r = (byte)(value / 256 / 256 % 256); |
| | | g = (byte)(value / 256 % 256); |
| | | b = (byte)(value % 256); |
| | | a = (byte)(value / 256 / 256 / 256 % 256); |
| | | |
| | | mHDLWaveSeekBar.SetWaveBorderColor(Android.Graphics.Color.Argb(a, r, g, b)); |
| | | } |
| | | } |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | ///// <summary> |
| | | ///// è¿åº¦åºåèæ¯é»è®¤é¢è² |
| | | ///// </summary> |
| | | ///// <value>è¿åº¦åºåèæ¯é»è®¤é¢è²</value> |
| | | //public uint WaveBgColor |
| | | //{ |
| | | // set |
| | | // { |
| | | // byte r, g, b, a; |
| | | // r = (byte)(value / 256 / 256 % 256); |
| | | // g = (byte)(value / 256 % 256); |
| | | // b = (byte)(value % 256); |
| | | // a = (byte)(value / 256 / 256 / 256 % 256); |
| | | |
| | | // mHDLWaveSeekBar.SetWaveBgColor(Android.Graphics.Color.Argb(a, r, g, b)); |
| | | // } |
| | | //} |
| | | |
| | | |
| | | /// <summary> |
| | | /// è¿åº¦æ¡ä¸è¾¹æ¡è¾¹è· |
| | | /// </summary> |
| | | /// <value>åå¾</value> |
| | | public int WavePadding |
| | | { |
| | | set |
| | | { |
| | | mHDLWaveSeekBar.SetWavePadding(value); |
| | | } |
| | | } |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | //uint thumbColor = 0xFFFFFFFF; |
| | | ///// <summary> |
| | | ///// æå¨æé®åå½¢é¢è² |
| | | ///// </summary> |
| | | ///// <value>æå¨æé®é¢è²</value> |
| | | //public uint ThumbColor |
| | | //{ |
| | | // get |
| | | // { |
| | | // return thumbColor; |
| | | // } |
| | | // set |
| | | // { |
| | | // thumbColor = value; |
| | | |
| | | // byte r, g, b, a; |
| | | // r = (byte)(thumbColor / 256 / 256 % 256); |
| | | // g = (byte)(thumbColor / 256 % 256); |
| | | // b = (byte)(thumbColor % 256); |
| | | // a = (byte)(thumbColor / 256 / 256 / 256 % 256); |
| | | |
| | | // mHDLWaveSeekBar.SetThumbColor(Android.Graphics.Color.Argb(a, r, g, b)); |
| | | // } |
| | | //} |
| | | |
| | | |
| | | |
| | | |
| | | /// <summary> |
| | | /// EventHandler |
| | | /// </summary> |
| | | public EventHandler<int> OnProgressChangedEvent; |
| | | public EventHandler<bool> OnStartTrackingTouchEvent; |
| | | public EventHandler<int> OnStopTrackingTouchEvent; |
| | | |
| | | /// <summary> |
| | | /// OnProgressChangeListener ç»§æ¿ååºäºä»¶ |
| | | /// </summary> |
| | | OnProgressChangeListener mOnProgressChangeListener; |
| | | |
| | | public class OnProgressChangeListener : Java.Lang.Object, HDLWaveSeekBar.IOnProgressChangeListener |
| | | { |
| | | |
| | | WaveSeekBar _WaveSeekBar; |
| | | |
| | | public OnProgressChangeListener(WaveSeekBar view) |
| | | { |
| | | _WaveSeekBar = view; |
| | | } |
| | | |
| | | public void OnProgressChanged(HDLWaveSeekBar p0, int p1, bool p2) |
| | | { |
| | | _WaveSeekBar.OnProgressChangedEvent?.Invoke(this, p0.Progress); |
| | | } |
| | | |
| | | public void OnStartTrackingTouch(HDLWaveSeekBar p0) |
| | | { |
| | | _WaveSeekBar.OnStartTrackingTouchEvent?.Invoke(this, true); |
| | | } |
| | | |
| | | public void OnStopTrackingTouch(HDLWaveSeekBar p0) |
| | | { |
| | | |
| | | //if (_WaveSeekBar.OnStopTrackingTouchEvent != null) |
| | | //{ |
| | | // _WaveSeekBar.OnStopTrackingTouchEvent(this, p0.Progress); |
| | | //} |
| | | _WaveSeekBar.OnStopTrackingTouchEvent?.Invoke(this, p0.Progress); |
| | | |
| | | } |
| | | } |
| | | } |
| | | } |
New file |
| | |
| | | using System; |
| | | using Android.Net; |
| | | using Android.Net.Wifi; |
| | | using Android.OS; |
| | | |
| | | namespace Shared |
| | | { |
| | | public static class WiimuUPnP |
| | | { |
| | | /// <summary> |
| | | /// è·åå½åWIFIçåç§° |
| | | /// </summary> |
| | | /// <value>The ssid.</value> |
| | | public static string SSID |
| | | { |
| | | get |
| | | { |
| | | return getWIFISSID(Shared.Application.Activity); |
| | | } |
| | | } |
| | | |
| | | |
| | | /** |
| | | * è·åSSID |
| | | * @param activity ä¸ä¸æ |
| | | * @return WIFI çSSID |
| | | */ |
| | | static string getWIFISSID(Android.App.Activity activity) |
| | | { |
| | | var ssid = "unknown id"; |
| | | |
| | | if ((int)Build.VERSION.SdkInt <= 26/*8.0*/ || (int)Build.VERSION.SdkInt >= 28/*9.0*/) |
| | | { |
| | | var mWifiManager = (WifiManager)activity.ApplicationContext.GetSystemService(Android.Content.Context.WifiService); |
| | | |
| | | if (mWifiManager != null) |
| | | { |
| | | var info = mWifiManager.ConnectionInfo; |
| | | |
| | | if ((int)Build.VERSION.SdkInt < 19/*4.4*/) |
| | | { |
| | | return info.SSID; |
| | | } |
| | | else |
| | | { |
| | | return info.SSID.Replace("\"", ""); |
| | | } |
| | | } |
| | | } |
| | | //8.1 |
| | | else if ((int)Build.VERSION.SdkInt == 27) |
| | | { |
| | | var connManager = (ConnectivityManager)activity.ApplicationContext.GetSystemService(Android.Content.Context.ConnectivityService); |
| | | if (connManager != null) |
| | | { |
| | | var networkInfo = connManager.ActiveNetworkInfo; |
| | | if (networkInfo.IsConnected) |
| | | { |
| | | if (networkInfo.ExtraInfo != null) |
| | | { |
| | | return networkInfo.ExtraInfo.Replace("\"", ""); |
| | | } |
| | | } |
| | | } |
| | | } |
| | | return ssid; |
| | | } |
| | | |
| | | |
| | | |
| | | static Action<string> currentAction; |
| | | /// <summary> |
| | | /// å¯å¨é
ç½®æ 线ä¸ç½ |
| | | /// </summary> |
| | | /// <returns>The start.</returns> |
| | | /// <param name="password">å¯ç </param> |
| | | /// <param name="a">é
ç½®å®æååé¦çç»æ</param> |
| | | public static void Start(string password,Action<string> action) |
| | | { |
| | | if (SSID == null) |
| | | { |
| | | return; |
| | | } |
| | | |
| | | Stop(); |
| | | dateTime = DateTime.Now; |
| | | currentAction = action; |
| | | action ("TimeOut"); |
| | | } |
| | | |
| | | static WiimuUPnP() |
| | | { |
| | | //宿¶æ£æ¥ |
| | | System.Threading.Tasks.Task.Run(() => |
| | | { |
| | | while (true) |
| | | { |
| | | System.Threading.Thread.Sleep(1000); |
| | | if (20 <= (System.DateTime.Now - dateTime).TotalSeconds) |
| | | { |
| | | Stop(); |
| | | if (currentAction != null) |
| | | { |
| | | currentAction("TimeOut"); |
| | | } |
| | | } |
| | | } |
| | | }); |
| | | } |
| | | |
| | | /// <summary> |
| | | /// è®°å½å¼å§æ¶é´ |
| | | /// </summary> |
| | | static DateTime dateTime = DateTime.MaxValue; |
| | | |
| | | /// <summary> |
| | | /// 忢é
ç½®æ 线ä¸ç½ |
| | | /// </summary> |
| | | public static void Stop() |
| | | { |
| | | dateTime = DateTime.MaxValue; |
| | | } |
| | | } |
| | | |
| | | } |
New file |
| | |
| | | using System; |
| | | using Android.Graphics; |
| | | using Com.Hdl.Widget; |
| | | |
| | | namespace Shared |
| | | { |
| | | public class HDLUtils |
| | | { |
| | | public static int RectCornerTopLeft = 1; |
| | | public static int RectCornerTopRight = 2; |
| | | public static int RectCornerBottomLeft = 4; |
| | | public static int RectCornerBottomRight = 8; |
| | | |
| | | |
| | | |
| | | /// <summary> |
| | | /// éå¯APP |
| | | /// </summary> |
| | | public static void RestartApp() { |
| | | |
| | | HDLUtlisXM.RelaunchApp(Application.Activity, true); |
| | | |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 设置åçæ§ä»¶åº authoritiesçå¼ |
| | | /// </summary> |
| | | public static void SetAuthoritiesName(string name) |
| | | { |
| | | HDLUtlisXM.MAuthorityNAME = name; |
| | | } |
| | | |
| | | ///// <summary> |
| | | ///// çæäºç»´ç |
| | | ///// </summary> |
| | | //public static Bitmap createQRCode(string url, int size = 500) |
| | | //{ |
| | | // return HDLUtlisXM.CreateQRCode(url, size); |
| | | //} |
| | | |
| | | |
| | | |
| | | } |
| | | } |
New file |
| | |
| | | using System; |
| | | using Java.Lang; |
| | | //using Shared.Droid.TBL; |
| | | using Moe.Feng.Support.Biometricprompt; |
| | | using Android.OS; |
| | | using Android.Content; |
| | | //using Com.Bigkoo.Pickerview; |
| | | |
| | | |
| | | namespace Shared |
| | | { |
| | | public class TouchIDUtils |
| | | { |
| | | |
| | | public enum TouchIDSupperType |
| | | { |
| | | TouchID, |
| | | FaceID, |
| | | None |
| | | } |
| | | |
| | | public enum TouchIDState |
| | | { |
| | | NotSupport, |
| | | Success, |
| | | Fail, |
| | | InputPassword, |
| | | TouchIDLockout |
| | | } |
| | | |
| | | |
| | | //BiometricPromptCompat mBiometricPrompt; |
| | | //public TouchIDUtils() |
| | | //{ |
| | | // mOnIAuthenticationCallback = new OnIAuthenticationCallback(this); |
| | | // mBiometricPrompt = new BiometricPromptCompat.Builder(Application.Activity).SetTitle("éªè¯").SetSubtitle("").SetDescription("").Build(); |
| | | |
| | | |
| | | |
| | | //} |
| | | |
| | | |
| | | |
| | | |
| | | public static TouchIDSupperType getTouchIDSupperType() |
| | | { |
| | | |
| | | TouchIDSupperType type = TouchIDSupperType.None; |
| | | |
| | | bool bIsHardwareDetected = BiometricPromptCompat.IsHardwareDetected(Application.Activity); |
| | | bool bHasEnrolledFingerprints = BiometricPromptCompat.HasEnrolledFingerprints(Application.Activity); |
| | | |
| | | if (bIsHardwareDetected && bHasEnrolledFingerprints) |
| | | { |
| | | type = TouchIDSupperType.TouchID; |
| | | } |
| | | else |
| | | { |
| | | type = TouchIDSupperType.None; |
| | | } |
| | | |
| | | return type; |
| | | |
| | | } |
| | | |
| | | |
| | | public EventHandler<TouchIDState> OnHDLTouchIDStateBackEvent; |
| | | |
| | | |
| | | //StateBlock mStateBlock; |
| | | |
| | | /// <summary> |
| | | /// å¼¹çªæçº¹éªè¯ descTitleï¼è¾å
¥å¯ç éªè¯æé®æ é¢ mLocalizedReasonï¼Touchæ¾ç¤ºçæè¿° |
| | | /// </summary> |
| | | /// <value>descTitleï¼è¾å
¥å¯ç éªè¯æé®æ é¢ mLocalizedReasonï¼Touchæ¾ç¤ºçæè¿°</value> |
| | | public void showTouchIDWithDescribe(string descTitle, string mLocalizedReason) |
| | | { |
| | | |
| | | |
| | | if (descTitle == null) |
| | | { |
| | | descTitle = "è¾å
¥å¯ç éªè¯"; |
| | | } |
| | | |
| | | if (mLocalizedReason == null) |
| | | { |
| | | mLocalizedReason = "éè¿å·²ææçº¹éªè¯"; |
| | | } |
| | | |
| | | |
| | | //BiometricPromptCompat biometricPrompt = |
| | | // new BiometricPromptCompat.Builder(Application.Activity).SetTitle("éªè¯").SetSubtitle(mLocalizedReason).SetDescription("").SetNegativeButton(descTitle, new Android.Content.IDialogInterfaceOnClickListenerInvoker().Build(); |
| | | BiometricPromptCompat biometricPrompt = |
| | | new BiometricPromptCompat.Builder(Application.Activity).SetTitle("éªè¯").SetSubtitle(mLocalizedReason).SetDescription("").SetNegativeButton(descTitle, new MyIputPasswordClickListener(this)).Build(); |
| | | CancellationSignal cancellationSignal = new CancellationSignal(); |
| | | cancellationSignal.CancelEvent += (sender1, e1) => { |
| | | System.Console.WriteLine("KKï¼ç¹å»äºåæ¶æé®"); |
| | | }; |
| | | //biometricPrompt.Authenticate(cancellationSignal, null); |
| | | biometricPrompt.Authenticate(cancellationSignal, new OnIAuthenticationCallback(this)); |
| | | |
| | | } |
| | | |
| | | class MyIputPasswordClickListener : Java.Lang.Object,Android.Content.IDialogInterfaceOnClickListener |
| | | { |
| | | |
| | | TouchIDUtils _TouchIDUtils; |
| | | |
| | | public MyIputPasswordClickListener(TouchIDUtils obj) |
| | | { |
| | | _TouchIDUtils = obj; |
| | | } |
| | | |
| | | public void OnClick(IDialogInterface dialog, int which) |
| | | { |
| | | _TouchIDUtils.OnHDLTouchIDStateBackEvent?.Invoke(this, TouchIDState.InputPassword); |
| | | } |
| | | } |
| | | |
| | | |
| | | |
| | | //â . OnAuthenticationErrorï¼int errorCode, ICharSequence errStringï¼ è¿ä¸ªæ¥å£ä¼åç³»ç»æçº¹è®¤è¯åºç°ä¸å¯æ¢å¤çéè¯¯çæ¶åæä¼è°ç¨ï¼å¹¶ä¸åæ°errorCodeå°±ç»åºäºé误ç ï¼æ è¯äºé误çåå ã |
| | | // å¨AndroidP以åï¼è¿ä¸ªæ¹æ³åè°åæ¥ä¹åï¼æçº¹è¯å«sensorå°ä¼è¢«å
³éï¼ä¹å°±æ¯è¯´ï¼ä½ åææææ¾å¨æçº¹ç¡¬ä»¶ä¸ï¼å°ä¸ä¼æååºäºãè¿æ¶åä½ éè¦æç¤ºç¨æ·å
³éæçº¹è¯å«å¼¹çªï¼ææ¹ç¨å¯ç æ¯ä»çç |
| | | // ä»ä¹æ
åµä¸ä¼åè°erroré误å¢ï¼æ¯å¦ï¼è¿ç»è¯å«é误5次æçº¹ãæçº¹ç¡¬ä»¶ä¸å¯ç¨ççã |
| | | //â¡. OnAuthenticationFailed()è¿ä¸ªæ¥å£ä¼å¨ç³»ç»æçº¹è®¤è¯å¤±è´¥çæ
åµç䏿ä¼åè°ã注æè¿éç认è¯å¤±è´¥åä¸é¢ç认è¯é误æ¯ä¸ä¸æ ·çï¼è½ç¶ç»æé½æ¯ä¸è½è®¤è¯ã |
| | | // 认è¯å¤±è´¥æ¯æææçä¿¡æ¯é½éé宿´ï¼å¹¶ä¸æ²¡æä»»ä½å¼å¸¸ï¼ä½æ¯è¿ä¸ªæçº¹åä¹å注åçæçº¹æ¯ä¸ç¸ç¬¦çï¼ä½æ¯è®¤è¯éè¯¯æ¯æå¨ééæè
认è¯çè¿ç¨ä¸åºç°äºéè¯¯ï¼ |
| | | // æ¯å¦æçº¹ä¼ æå¨å·¥ä½å¼å¸¸çãä¹å°±æ¯è¯´è®¤è¯å¤±è´¥æ¯ä¸ä¸ªå¯ä»¥é¢æçæ£å¸¸æ
åµï¼è认è¯é误æ¯ä¸å¯é¢æçå¼å¸¸æ
åµã |
| | | //â¢.OnAuthenticationHelp(int helpMsgId, ICharSequence helpString)ä¸é¢ç认è¯å¤±è´¥æ¯è®¤è¯è¿ç¨ä¸çä¸ä¸ªå¼å¸¸æ
åµï¼æä»¬è¯´é£ç§æ
嵿¯å 为åºç°äºä¸å¯æ¢å¤çéè¯¯ï¼ |
| | | // èæä»¬è¿éçOnAuthenticationHelpæ¹æ³æ¯åºç°äºå¯ä»¥åå¤çå¼å¸¸æä¼è°ç¨çãä»ä¹æ¯å¯ä»¥æ¢å¤çå¼å¸¸å¢ï¼ä¸ä¸ªå¸¸è§çä¾åå°±æ¯ï¼ææç§»å¨å¤ªå¿«ï¼å½æä»¬ææææ¾å°ä¼ æå¨ä¸çæ¶åï¼ |
| | | // 妿æä»¬å¾å¿«å°å°ææç§»èµ°çè¯ï¼é£ä¹æçº¹ä¼ æå¨å¯è½åªééäºé¨åçä¿¡æ¯ï¼å æ¤è®¤è¯ä¼å¤±è´¥ã使¯è¿ä¸ªé误æ¯å¯ä»¥æ¢å¤çï¼å æ¤åªè¦æç¤ºç¨æ·å次æä¸æçº¹ï¼å¹¶ä¸ä¸è¦å¤ªå¿«ç§»èµ°å°±å¯ä»¥è§£å³ã |
| | | //â£. OnAuthenticationSucceeded(FingerprintManagerCompati.AuthenticationResult result)è¿ä¸ªæ¥å£ä¼å¨è®¤è¯æåä¹ååè°ãæä»¬å¯ä»¥å¨è¿ä¸ªæ¹æ³ä¸æç¤ºç¨æ·è®¤è¯æåã |
| | | // è¿ééè¦è¯´æä¸ä¸ï¼å¦ææä»¬ä¸é¢å¨è°ç¨authenticateçæ¶åï¼æä»¬çCryptoObject䏿¯nullçè¯ï¼é£ä¹æä»¬å¨è¿ä¸ªæ¹æ³ä¸å¯ä»¥éè¿AuthenticationResultæ¥è·å¾Cypher对象ç¶åè°ç¨å®çdoFinalæ¹æ³ã |
| | | // doFinalæ¹æ³ä¼æ£æ¥ç»ææ¯ä¸æ¯ä¼æ¦æªæè
篡æ¹è¿ï¼å¦ææ¯çè¯ä¼æåºä¸ä¸ªå¼å¸¸ã彿们åç°è¿äºå¼å¸¸çæ¶åé½åºè¯¥å°è®¤è¯å½åæ¯å¤±è´¥æ¥æ¥å¤çï¼ä¸ºäºå®å
¨å»ºè®®å¤§å®¶é½è¿ä¹åã |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | /// <summary> |
| | | /// OnProgressChangeListener ç»§æ¿ååºäºä»¶ |
| | | /// </summary> |
| | | OnIAuthenticationCallback mOnIAuthenticationCallback; |
| | | |
| | | //BiometricPromptCompat.IAuthenticationCallback |
| | | public class OnIAuthenticationCallback : Java.Lang.Object,BiometricPromptCompat.IAuthenticationCallback |
| | | { |
| | | |
| | | TouchIDUtils _TouchIDUtils; |
| | | |
| | | public OnIAuthenticationCallback(TouchIDUtils obj) |
| | | { |
| | | _TouchIDUtils = obj; |
| | | } |
| | | |
| | | public void OnAuthenticationError(int mErrorId, ICharSequence mErrorStr) |
| | | { |
| | | //throw new NotImplementedException(); |
| | | if (mErrorId == 7) |
| | | { |
| | | _TouchIDUtils.OnHDLTouchIDStateBackEvent?.Invoke(this, TouchIDState.NotSupport); |
| | | //System.Console.WriteLine("KKï¼Errorï¼" + mErrorStr.ToString()); |
| | | } |
| | | else { |
| | | System.Console.WriteLine("KKï¼Error" + mErrorStr.ToString() + " CODE:" + mErrorId); |
| | | } |
| | | |
| | | } |
| | | |
| | | |
| | | public void OnAuthenticationFailed() |
| | | { |
| | | //throw new NotImplementedException(); |
| | | System.Console.WriteLine("KKï¼Failedæ æ³è¯å«ï¼è¯·åè¯ä¸æ¬¡"); |
| | | |
| | | } |
| | | |
| | | public void OnAuthenticationHelp(int mErrorId, ICharSequence mErrorStr) |
| | | { |
| | | //throw new NotImplementedException(); |
| | | //System.Console.WriteLine("KKï¼Helpæ æ³è¯å«ï¼è¯·åè¯ä¸æ¬¡"); |
| | | System.Console.WriteLine("KKï¼Error" + mErrorStr.ToString() + " CODE:" + mErrorId); |
| | | } |
| | | |
| | | public void OnAuthenticationSucceeded(BiometricPromptCompat.IAuthenticationResult p0) |
| | | { |
| | | _TouchIDUtils.OnHDLTouchIDStateBackEvent?.Invoke(this, TouchIDState.Success); |
| | | } |
| | | |
| | | } |
| | | |
| | | |
| | | // åä¾ |
| | | static TouchIDUtils ourInstance = new TouchIDUtils(); |
| | | |
| | | public static TouchIDUtils Instance |
| | | { |
| | | get |
| | | { |
| | | return ourInstance; |
| | | } |
| | | } |
| | | |
| | | |
| | | } |
| | | } |
ZigbeeApp/Shared/.DS_Store
ZigbeeApp/Shared/DLL/Android/Shared.Droid.dll
ZigbeeApp/Shared/Phone/UserView/UserHomeView.cs |