using System; using System.Collections.Generic; using SRF; using SRF.Service; using UnityEngine; using UnityEngine.SceneManagement; namespace SRDebugger.Services.Implementation { [Service(typeof(ISystemInformationService))] public class StandardSystemInformationService : ISystemInformationService { private class Info : ISystemInfo { private Func _valueGetter; public string Title { get; set; } public object Value { get { try { return _valueGetter(); } catch (Exception ex) { return "Error ({0})".Fmt(ex.GetType().Name); } } } public bool IsPrivate { get; set; } public static Info Create(string name, Func getter, bool isPrivate = false) { Info info = new Info(); info.Title = name; info._valueGetter = getter; info.IsPrivate = isPrivate; return info; } public static Info Create(string name, object value, bool isPrivate = false) { Info info = new Info(); info.Title = name; info._valueGetter = () => value; info.IsPrivate = isPrivate; return info; } } private readonly Dictionary> _info = new Dictionary>(); public StandardSystemInformationService() { CreateDefaultSet(); } public IEnumerable GetCategories() { return _info.Keys; } public IList GetInfo(string category) { IList value; if (!_info.TryGetValue(category, out value)) { Debug.LogError("[SystemInformationService] Category not found: {0}".Fmt(category)); return new ISystemInfo[0]; } return value; } public Dictionary> CreateReport(bool includePrivate = false) { Dictionary> dictionary = new Dictionary>(); foreach (KeyValuePair> item in _info) { Dictionary dictionary2 = new Dictionary(); foreach (ISystemInfo item2 in item.Value) { if (!item2.IsPrivate || includePrivate) { dictionary2.Add(item2.Title, item2.Value); } } dictionary.Add(item.Key, dictionary2); } return dictionary; } private void CreateDefaultSet() { _info.Add("System", new Info[7] { Info.Create("Operating System", SystemInfo.operatingSystem), Info.Create("Device Name", SystemInfo.deviceName, true), Info.Create("Device Type", SystemInfo.deviceType), Info.Create("Device Model", SystemInfo.deviceModel), Info.Create("CPU Type", SystemInfo.processorType), Info.Create("CPU Count", SystemInfo.processorCount), Info.Create("System Memory", SRFileUtil.GetBytesReadable((long)SystemInfo.systemMemorySize * 1024L * 1024)) }); _info.Add("Unity", new Info[7] { Info.Create("Version", Application.unityVersion), Info.Create("Debug", Debug.isDebugBuild), Info.Create("Unity Pro", Application.HasProLicense()), Info.Create("Genuine", "{0} ({1})".Fmt((!Application.genuine) ? "No" : "Yes", (!Application.genuineCheckAvailable) ? "Untrusted" : "Trusted")), Info.Create("System Language", Application.systemLanguage), Info.Create("Platform", Application.platform), Info.Create("SRDebugger Version", "1.4.6") }); _info.Add("Display", new Info[4] { Info.Create("Resolution", () => Screen.width + "x" + Screen.height), Info.Create("DPI", () => Screen.dpi), Info.Create("Fullscreen", () => Screen.fullScreen), Info.Create("Orientation", () => Screen.orientation) }); _info.Add("Runtime", new Info[4] { Info.Create("Play Time", () => Time.unscaledTime), Info.Create("Level Play Time", () => Time.timeSinceLevelLoad), Info.Create("Current Level", delegate { Scene activeScene = SceneManager.GetActiveScene(); return "{0} (Index: {1})".Fmt(activeScene.name, activeScene.buildIndex); }), Info.Create("Quality Level", () => QualitySettings.names[QualitySettings.GetQualityLevel()] + " (" + QualitySettings.GetQualityLevel() + ")") }); TextAsset textAsset = (TextAsset)Resources.Load("UnityCloudBuildManifest.json"); Dictionary dictionary = ((!(textAsset != null)) ? null : (Json.Deserialize(textAsset.text) as Dictionary)); if (dictionary != null) { List list = new List(dictionary.Count); foreach (KeyValuePair item in dictionary) { if (item.Value != null) { string value = item.Value.ToString(); list.Add(Info.Create(GetCloudManifestPrettyName(item.Key), value)); } } _info.Add("Build", list); } _info.Add("Features", new Info[4] { Info.Create("Location", SystemInfo.supportsLocationService), Info.Create("Accelerometer", SystemInfo.supportsAccelerometer), Info.Create("Gyroscope", SystemInfo.supportsGyroscope), Info.Create("Vibration", SystemInfo.supportsVibration) }); _info.Add("Graphics", new Info[15] { Info.Create("Device Name", SystemInfo.graphicsDeviceName), Info.Create("Device Vendor", SystemInfo.graphicsDeviceVendor), Info.Create("Device Version", SystemInfo.graphicsDeviceVersion), Info.Create("Max Tex Size", SystemInfo.maxTextureSize), Info.Create("Fill Rate", (SystemInfo.graphicsPixelFillrate <= 0) ? "Unknown" : "{0}mpix/s".Fmt(SystemInfo.graphicsPixelFillrate)), Info.Create("NPOT Support", SystemInfo.npotSupport), Info.Create("Render Textures", "{0} ({1})".Fmt((!SystemInfo.supportsRenderTextures) ? "No" : "Yes", SystemInfo.supportedRenderTargetCount)), Info.Create("3D Textures", SystemInfo.supports3DTextures), Info.Create("Compute Shaders", SystemInfo.supportsComputeShaders), Info.Create("Vertex Programs", SystemInfo.supportsVertexPrograms), Info.Create("Image Effects", SystemInfo.supportsImageEffects), Info.Create("Cubemaps", SystemInfo.supportsRenderToCubemap), Info.Create("Shadows", SystemInfo.supportsShadows), Info.Create("Stencil", SystemInfo.supportsStencil), Info.Create("Sparse Textures", SystemInfo.supportsSparseTextures) }); } 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"; default: return name.Substring(0, 1).ToUpper() + name.Substring(1); } } } }