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);
 | |
|         }
 | |
|     }
 | |
| }
 |