245 lines
		
	
	
		
			9.8 KiB
		
	
	
	
		
			C#
		
	
	
	
		
		
			
		
	
	
			245 lines
		
	
	
		
			9.8 KiB
		
	
	
	
		
			C#
		
	
	
	
|  | namespace SRDebugger.Services.Implementation | |||
|  | { | |||
|  |     using System; | |||
|  |     using System.Collections.Generic; | |||
|  |     using System.Linq; | |||
|  |     using SRF; | |||
|  |     using SRF.Service; | |||
|  |     using UnityEngine; | |||
|  | 
 | |||
|  |     /// <summary> | |||
|  |     /// Reports system specifications and environment information. Information that can | |||
|  |     /// be used to identify a user is marked as private, and won't be included in any generated | |||
|  |     /// reports. | |||
|  |     /// </summary> | |||
|  |     [Service(typeof(ISystemInformationService))] | |||
|  |     public class StandardSystemInformationService : ISystemInformationService | |||
|  |     { | |||
|  |         private readonly Dictionary<string, IList<InfoEntry>> _info = new Dictionary<string, IList<InfoEntry>>(); | |||
|  | 
 | |||
|  |         public StandardSystemInformationService() | |||
|  |         { | |||
|  |             CreateDefaultSet(); | |||
|  |         } | |||
|  | 
 | |||
|  |         public IEnumerable<string> GetCategories() | |||
|  |         { | |||
|  |             return _info.Keys; | |||
|  |         } | |||
|  | 
 | |||
|  |         public IList<InfoEntry> GetInfo(string category) | |||
|  |         { | |||
|  |             IList<InfoEntry> list; | |||
|  | 
 | |||
|  |             if (!_info.TryGetValue(category, out list)) | |||
|  |             { | |||
|  |                 Debug.LogError("[SystemInformationService] Category not found: {0}".Fmt(category)); | |||
|  |                 return new InfoEntry[0]; | |||
|  |             } | |||
|  | 
 | |||
|  |             return list; | |||
|  |         } | |||
|  | 
 | |||
|  |         public void Add(InfoEntry info, string category = "Default") | |||
|  |         { | |||
|  |             IList<InfoEntry> list; | |||
|  | 
 | |||
|  |             if (!_info.TryGetValue(category, out list)) | |||
|  |             { | |||
|  |                 list = new List<InfoEntry>(); | |||
|  |                 _info.Add(category, list); | |||
|  |             } | |||
|  | 
 | |||
|  |             if (list.Any(p => p.Title == info.Title)) | |||
|  |             { | |||
|  |                 throw new ArgumentException("An InfoEntry object with the same title already exists in that category.", "info"); | |||
|  |             } | |||
|  | 
 | |||
|  |             list.Add(info); | |||
|  |         } | |||
|  | 
 | |||
|  |         public Dictionary<string, Dictionary<string, object>> CreateReport(bool includePrivate = false) | |||
|  |         { | |||
|  |             var dict = new Dictionary<string, Dictionary<string, object>>(); | |||
|  | 
 | |||
|  |             foreach (var keyValuePair in _info) | |||
|  |             { | |||
|  |                 var category = new Dictionary<string, object>(); | |||
|  | 
 | |||
|  |                 foreach (var systemInfo in keyValuePair.Value) | |||
|  |                 { | |||
|  |                     if (systemInfo.IsPrivate && !includePrivate) | |||
|  |                     { | |||
|  |                         continue; | |||
|  |                     } | |||
|  | 
 | |||
|  |                     category.Add(systemInfo.Title, systemInfo.Value); | |||
|  |                 } | |||
|  | 
 | |||
|  |                 dict.Add(keyValuePair.Key, category); | |||
|  |             } | |||
|  | 
 | |||
|  |             return dict; | |||
|  |         } | |||
|  | 
 | |||
|  |         private void CreateDefaultSet() | |||
|  |         { | |||
|  |             _info.Add("System", new[] | |||
|  |             { | |||
|  |                 InfoEntry.Create("Operating System", UnityEngine.SystemInfo.operatingSystem), | |||
|  |                 InfoEntry.Create("Device Name", UnityEngine.SystemInfo.deviceName, true), | |||
|  |                 InfoEntry.Create("Device Type", UnityEngine.SystemInfo.deviceType), | |||
|  |                 InfoEntry.Create("Device Model", UnityEngine.SystemInfo.deviceModel), | |||
|  |                 InfoEntry.Create("CPU Type", UnityEngine.SystemInfo.processorType), | |||
|  |                 InfoEntry.Create("CPU Count", UnityEngine.SystemInfo.processorCount), | |||
|  |                 InfoEntry.Create("System Memory", SRFileUtil.GetBytesReadable(((long) UnityEngine.SystemInfo.systemMemorySize)*1024*1024)) | |||
|  |                 //Info.Create("Process Name", () => Process.GetCurrentProcess().ProcessName) | |||
|  |             }); | |||
|  | 
 | |||
|  | 
 | |||
|  | #if ENABLE_IL2CPP | |||
|  |             const string IL2CPP = "Yes"; | |||
|  | #else | |||
|  |             const string IL2CPP = "No"; | |||
|  | #endif | |||
|  | 
 | |||
|  |             _info.Add("Unity", new[] | |||
|  |             { | |||
|  |                 InfoEntry.Create("Version", Application.unityVersion), | |||
|  |                 InfoEntry.Create("Debug", Debug.isDebugBuild), | |||
|  |                 InfoEntry.Create("Unity Pro", Application.HasProLicense()), | |||
|  |                 InfoEntry.Create("Genuine", | |||
|  |                     "{0} ({1})".Fmt(Application.genuine ? "Yes" : "No", | |||
|  |                         Application.genuineCheckAvailable ? "Trusted" : "Untrusted")), | |||
|  |                 InfoEntry.Create("System Language", Application.systemLanguage), | |||
|  |                 InfoEntry.Create("Platform", Application.platform), | |||
|  |                 InfoEntry.Create("IL2CPP", IL2CPP), | |||
|  |                 InfoEntry.Create("Application Version", Application.version), | |||
|  |                 InfoEntry.Create("SRDebugger Version", SRDebug.Version), | |||
|  |             }); | |||
|  | 
 | |||
|  |             _info.Add("Display", new[] | |||
|  |             { | |||
|  |                 InfoEntry.Create("Resolution", () => Screen.width + "x" + Screen.height), | |||
|  |                 InfoEntry.Create("DPI", () => Screen.dpi), | |||
|  |                 InfoEntry.Create("Fullscreen", () => Screen.fullScreen), | |||
|  |                 InfoEntry.Create("Orientation", () => Screen.orientation) | |||
|  |             }); | |||
|  | 
 | |||
|  |             _info.Add("Runtime", new[] | |||
|  |             { | |||
|  |                 InfoEntry.Create("Play Time", () => Time.unscaledTime), | |||
|  |                 InfoEntry.Create("Level Play Time", () => Time.timeSinceLevelLoad), | |||
|  | #if UNITY_4_6 || UNITY_4_7 || UNITY_5_0 || UNITY_5_1 || UNITY_5_2 | |||
|  |                 InfoEntry.Create("Current Level", () => Application.loadedLevelName), | |||
|  | #else | |||
|  |                 InfoEntry.Create("Current Level", () => | |||
|  |                 { | |||
|  |                     var activeScene = UnityEngine.SceneManagement.SceneManager.GetActiveScene(); | |||
|  |                     return "{0} (Index: {1})".Fmt(activeScene.name, activeScene.buildIndex); | |||
|  |                 }), | |||
|  | #endif | |||
|  |                 InfoEntry.Create("Quality Level", | |||
|  |                     () => | |||
|  |                         QualitySettings.names[QualitySettings.GetQualityLevel()] + " (" + | |||
|  |                         QualitySettings.GetQualityLevel() + ")") | |||
|  |             }); | |||
|  | 
 | |||
|  |             // Check for cloud build manifest | |||
|  |             var cloudBuildManifest = (TextAsset)Resources.Load("UnityCloudBuildManifest.json"); | |||
|  |             var manifestDict = cloudBuildManifest != null | |||
|  |                 ? Json.Deserialize(cloudBuildManifest.text) as Dictionary<string, object> | |||
|  |                 : null; | |||
|  | 
 | |||
|  |             if (manifestDict != null) | |||
|  |             { | |||
|  |                 var manifestList = new List<InfoEntry>(manifestDict.Count); | |||
|  | 
 | |||
|  |                 foreach (var kvp in manifestDict) | |||
|  |                 { | |||
|  |                     if (kvp.Value == null) | |||
|  |                     { | |||
|  |                         continue; | |||
|  |                     } | |||
|  | 
 | |||
|  |                     var value = kvp.Value.ToString(); | |||
|  |                     manifestList.Add(InfoEntry.Create(GetCloudManifestPrettyName(kvp.Key), value)); | |||
|  |                 } | |||
|  | 
 | |||
|  |                 _info.Add("Build", manifestList); | |||
|  |             } | |||
|  | 
 | |||
|  |             _info.Add("Features", new[] | |||
|  |             { | |||
|  |                 InfoEntry.Create("Location", UnityEngine.SystemInfo.supportsLocationService), | |||
|  |                 InfoEntry.Create("Accelerometer", UnityEngine.SystemInfo.supportsAccelerometer), | |||
|  |                 InfoEntry.Create("Gyroscope", UnityEngine.SystemInfo.supportsGyroscope), | |||
|  |                 InfoEntry.Create("Vibration", UnityEngine.SystemInfo.supportsVibration) | |||
|  |             }); | |||
|  | 
 | |||
|  | #if UNITY_IOS | |||
|  | 
 | |||
|  |             _info.Add("iOS", new[] { | |||
|  | 
 | |||
|  | #if UNITY_5 || UNITY_5_3_OR_NEWER | |||
|  |                 InfoEntry.Create("Generation", UnityEngine.iOS.Device.generation), | |||
|  |                 InfoEntry.Create("Ad Tracking", UnityEngine.iOS.Device.advertisingTrackingEnabled), | |||
|  | #else            | |||
|  |                 InfoEntry.Create("Generation", iPhone.generation), | |||
|  |                 InfoEntry.Create("Ad Tracking", iPhone.advertisingTrackingEnabled), | |||
|  | #endif | |||
|  |             }); | |||
|  | 
 | |||
|  | #endif | |||
|  | #pragma warning disable 618 | |||
|  |             _info.Add("Graphics", new[] | |||
|  |             { | |||
|  |                 InfoEntry.Create("Device Name", UnityEngine.SystemInfo.graphicsDeviceName), | |||
|  |                 InfoEntry.Create("Device Vendor", UnityEngine.SystemInfo.graphicsDeviceVendor), | |||
|  |                 InfoEntry.Create("Device Version", UnityEngine.SystemInfo.graphicsDeviceVersion), | |||
|  |                 InfoEntry.Create("Max Tex Size", UnityEngine.SystemInfo.maxTextureSize), | |||
|  | #if !UNITY_5 && !UNITY_5_3_OR_NEWER | |||
|  |                 InfoEntry.Create("Fill Rate", | |||
|  |                     SystemInfo.graphicsPixelFillrate > 0 ? "{0}mpix/s".Fmt(SystemInfo.graphicsPixelFillrate) : "Unknown"), | |||
|  | #endif | |||
|  |                 InfoEntry.Create("NPOT Support", UnityEngine.SystemInfo.npotSupport), | |||
|  |                 InfoEntry.Create("Render Textures", | |||
|  |                     "{0} ({1})".Fmt(UnityEngine.SystemInfo.supportsRenderTextures ? "Yes" : "No", | |||
|  |                         UnityEngine.SystemInfo.supportedRenderTargetCount)), | |||
|  |                 InfoEntry.Create("3D Textures", UnityEngine.SystemInfo.supports3DTextures), | |||
|  |                 InfoEntry.Create("Compute Shaders", UnityEngine.SystemInfo.supportsComputeShaders), | |||
|  | #if !UNITY_5 && !UNITY_5_3_OR_NEWER | |||
|  |                 InfoEntry.Create("Vertex Programs", SystemInfo.supportsVertexPrograms), | |||
|  | #endif | |||
|  |                 InfoEntry.Create("Image Effects", UnityEngine.SystemInfo.supportsImageEffects), | |||
|  |                 InfoEntry.Create("Cubemaps", UnityEngine.SystemInfo.supportsRenderToCubemap), | |||
|  |                 InfoEntry.Create("Shadows", UnityEngine.SystemInfo.supportsShadows), | |||
|  |                 InfoEntry.Create("Stencil", UnityEngine.SystemInfo.supportsStencil), | |||
|  |                 InfoEntry.Create("Sparse Textures", UnityEngine.SystemInfo.supportsSparseTextures) | |||
|  |             }); | |||
|  | #pragma warning restore 618 | |||
|  |         } | |||
|  | 
 | |||
|  |         private static string GetCloudManifestPrettyName(string name) | |||
|  |         { | |||
|  |             switch (name) | |||
|  |             { | |||
|  |                 case "scmCommitId": | |||
|  |                     return "Commit"; | |||
|  | 
 | |||
|  |                 case "scmBranch": | |||
|  |                     return "Branch"; | |||
|  | 
 | |||
|  |                 case "cloudBuildTargetName": | |||
|  |                     return "Build Target"; | |||
|  | 
 | |||
|  |                 case "buildStartTime": | |||
|  |                     return "Build Date"; | |||
|  |             } | |||
|  | 
 | |||
|  |             // Return name with first letter capitalised | |||
|  |             return name.Substring(0, 1).ToUpper() + name.Substring(1); | |||
|  |         } | |||
|  |     } | |||
|  | } |