using System; using SRDebugger.Internal; using SRF; using SRF.Service; using UnityEngine; namespace SRDebugger.Services.Implementation { [Service(typeof(IDebugService))] public class SRDebugService : IDebugService { private readonly IDebugPanelService _debugPanelService; private readonly IDebugTriggerService _debugTrigger; private bool _entryCodeEnabled; private bool _hasAuthorised; private DefaultTabs? _queuedTab; public Settings Settings { get { return Settings.Instance; } } public bool IsDebugPanelVisible { get { return _debugPanelService.IsVisible; } } public bool IsTriggerEnabled { get { return _debugTrigger.IsEnabled; } set { _debugTrigger.IsEnabled = value; } } public bool IsProfilerDocked { get { return Service.PinnedUI.IsProfilerPinned; } set { Service.PinnedUI.IsProfilerPinned = value; } } public IDockConsoleService DockConsole { get { return Service.DockConsole; } } public event VisibilityChangedDelegate PanelVisibilityChanged; public SRDebugService() { SRServiceManager.RegisterService(this); SRServiceManager.GetService(); _debugTrigger = SRServiceManager.GetService(); _debugPanelService = SRServiceManager.GetService(); _debugPanelService.VisibilityChanged += DebugPanelServiceOnVisibilityChanged; _debugTrigger.IsEnabled = Settings.EnableTrigger == Settings.TriggerEnableModes.Enabled || (Settings.EnableTrigger == Settings.TriggerEnableModes.MobileOnly && Application.isMobilePlatform); _debugTrigger.Position = Settings.TriggerPosition; if (Settings.EnableKeyboardShortcuts) { SRServiceManager.GetService(); } _entryCodeEnabled = Settings.Instance.RequireCode && Settings.Instance.EntryCode.Count == 4; if (Settings.Instance.RequireCode && !_entryCodeEnabled) { Debug.LogError("[SRDebugger] RequireCode is enabled, but pin is not 4 digits"); } Transform transform = Hierarchy.Get("SRDebugger"); if ((bool)transform) { UnityEngine.Object.DontDestroyOnLoad(transform.gameObject); } } public void ShowDebugPanel(bool requireEntryCode = true) { if (requireEntryCode && _entryCodeEnabled && !_hasAuthorised) { PromptEntryCode(); } else { _debugPanelService.IsVisible = true; } } public void ShowDebugPanel(DefaultTabs tab, bool requireEntryCode = true) { if (requireEntryCode && _entryCodeEnabled && !_hasAuthorised) { _queuedTab = tab; PromptEntryCode(); } else { _debugPanelService.IsVisible = true; _debugPanelService.OpenTab(tab); } } public void HideDebugPanel() { _debugPanelService.IsVisible = false; } public void DestroyDebugPanel() { _debugPanelService.IsVisible = false; _debugPanelService.Unload(); } public void ShowBugReportSheet(ActionCompleteCallback onComplete = null, bool takeScreenshot = true, string descriptionContent = null) { BugReportPopoverService service = SRServiceManager.GetService(); if (service.IsShowingPopover) { return; } service.ShowBugReporter(delegate(bool succeed, string message) { if (onComplete != null) { onComplete(succeed); } }, takeScreenshot, descriptionContent); } private void DebugPanelServiceOnVisibilityChanged(IDebugPanelService debugPanelService, bool b) { if (this.PanelVisibilityChanged == null) { return; } try { this.PanelVisibilityChanged(b); } catch (Exception exception) { Debug.LogError("[SRDebugger] Event target threw exception (IDebugService.PanelVisiblityChanged)"); Debug.LogException(exception); } } private void PromptEntryCode() { SRServiceManager.GetService().ShowPinEntry(Settings.Instance.EntryCode, SRDebugStrings.Current.PinEntryPrompt, delegate(bool entered) { if (entered) { if (!Settings.Instance.RequireEntryCodeEveryTime) { _hasAuthorised = true; } if (_queuedTab.HasValue) { DefaultTabs value = _queuedTab.Value; _queuedTab = null; ShowDebugPanel(value, false); } else { ShowDebugPanel(false); } } _queuedTab = null; }); } } }