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