using System; using System.Collections; using SRDebugger.Internal; using SRDebugger.UI.Other; using SRF; using SRF.Service; using UnityEngine; using UnityEngine.UI; namespace SRDebugger.Services.Implementation { [Service(typeof(BugReportPopoverService))] public class BugReportPopoverService : SRServiceBase { private BugReportCompleteCallback _callback; private bool _isVisible; private BugReportPopoverRoot _popover; private BugReportSheetController _sheet; public bool IsShowingPopover { get { return _isVisible; } } public void ShowBugReporter(BugReportCompleteCallback callback, bool takeScreenshotFirst = true, string descriptionText = null) { if (_isVisible) { throw new InvalidOperationException("Bug report popover is already visible."); } if (_popover == null) { Load(); } if (_popover == null) { Debug.LogWarning("[SRDebugger] Bug report popover failed loading, executing callback with fail result"); callback(false, "Resource load failed"); return; } _callback = callback; _isVisible = true; SRDebuggerUtil.EnsureEventSystemExists(); StartCoroutine(OpenCo(takeScreenshotFirst, descriptionText)); } private IEnumerator OpenCo(bool takeScreenshot, string descriptionText) { if (takeScreenshot) { yield return StartCoroutine(BugReportScreenshotUtil.ScreenshotCaptureCo()); } _popover.CachedGameObject.SetActive(true); yield return new WaitForEndOfFrame(); if (!string.IsNullOrEmpty(descriptionText)) { _sheet.DescriptionField.text = descriptionText; } } private void SubmitComplete(bool didSucceed, string errorMessage) { OnComplete(didSucceed, errorMessage, false); } private void CancelPressed() { OnComplete(false, "User Cancelled", true); } private void OnComplete(bool success, string errorMessage, bool close) { if (!_isVisible) { Debug.LogWarning("[SRDebugger] Received callback at unexpected time. ???"); } else if (success || close) { _isVisible = false; if ((bool)GameController.Instance && !MenuManager.Instance.gameObject.activeSelf) { GameController.Instance.fishingPlayer.vrPlayertUIInput.TurnOnUIController(false); } _popover.gameObject.SetActive(false); UnityEngine.Object.Destroy(_popover.gameObject); _popover = null; _sheet = null; BugReportScreenshotUtil.ScreenshotData = null; _callback(success, errorMessage); } } private void TakingScreenshot() { if (!IsShowingPopover) { Debug.LogWarning("[SRDebugger] Received callback at unexpected time. ???"); } else { _popover.CanvasGroup.alpha = 0f; } } private void ScreenshotComplete() { if (!IsShowingPopover) { Debug.LogWarning("[SRDebugger] Received callback at unexpected time. ???"); } else { _popover.CanvasGroup.alpha = 1f; } } protected override void Awake() { base.Awake(); base.CachedTransform.SetParent(Hierarchy.Get("SRDebugger")); } private void Load() { BugReportPopoverRoot bugReportPopoverRoot = Resources.Load("SRDebugger/UI/Prefabs/BugReportPopover"); BugReportSheetController bugReportSheetController = Resources.Load("SRDebugger/UI/Prefabs/BugReportSheet"); if (bugReportPopoverRoot == null) { Debug.LogError("[SRDebugger] Unable to load bug report popover prefab"); return; } if (bugReportSheetController == null) { Debug.LogError("[SRDebugger] Unable to load bug report sheet prefab"); return; } _popover = SRInstantiate.Instantiate(bugReportPopoverRoot); _popover.CachedTransform.SetParent(base.CachedTransform, false); if (VRManager.IsVROn()) { _popover.GetComponent().renderMode = RenderMode.WorldSpace; _popover.GetComponent().worldCamera = VRManager.Instance.eyeCenterTransform.GetComponent(); _popover.GetComponent().dynamicPixelsPerUnit = 5f; RectTransform component = _popover.GetComponent(); component.anchoredPosition3D = new Vector3(0f, 0f, -0.2f); component.localScale = Vector3.one * 0.006f; OVRRaycaster oVRRaycaster = _popover.gameObject.AddComponent(); oVRRaycaster.sortOrder = _popover.GetComponent().sortingOrder; VRManager.Instance.FixBugReportPosition(_popover.transform); if ((bool)GameController.Instance && !MenuManager.Instance.gameObject.activeSelf) { GameController.Instance.fishingPlayer.vrPlayertUIInput.TurnOnUIController(true); } } _sheet = SRInstantiate.Instantiate(bugReportSheetController); _sheet.CachedTransform.SetParent(_popover.Container, false); _sheet.SubmitComplete = SubmitComplete; _sheet.CancelPressed = CancelPressed; _sheet.TakingScreenshot = TakingScreenshot; _sheet.ScreenshotComplete = ScreenshotComplete; _popover.CachedGameObject.SetActive(false); } } }