168 lines
		
	
	
		
			5.0 KiB
		
	
	
	
		
			C#
		
	
	
	
			
		
		
	
	
			168 lines
		
	
	
		
			5.0 KiB
		
	
	
	
		
			C#
		
	
	
	
| namespace SRDebugger.Services.Implementation
 | |
| {
 | |
|     using System;
 | |
|     using System.Collections;
 | |
|     using Internal;
 | |
|     using SRF;
 | |
|     using SRF.Service;
 | |
|     using UI.Other;
 | |
|     using UnityEngine;
 | |
| 
 | |
|     [Service(typeof (BugReportPopoverService))]
 | |
|     public class BugReportPopoverService : SRServiceBase<BugReportPopoverService>
 | |
|     {
 | |
|         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)
 | |
|             {
 | |
|                 // Wait for screenshot to be captured
 | |
|                 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. ???");
 | |
|                 return;
 | |
|             }
 | |
| 
 | |
|             if (!success && !close)
 | |
|             {
 | |
|                 return;
 | |
|             }
 | |
| 
 | |
|             _isVisible = false;
 | |
| 
 | |
|             // Destroy it all so it doesn't linger in the scene using memory
 | |
|             _popover.gameObject.SetActive(false);
 | |
|             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. ???");
 | |
|                 return;
 | |
|             }
 | |
| 
 | |
|             _popover.CanvasGroup.alpha = 0f;
 | |
|         }
 | |
| 
 | |
|         private void ScreenshotComplete()
 | |
|         {
 | |
|             if (!IsShowingPopover)
 | |
|             {
 | |
|                 Debug.LogWarning("[SRDebugger] Received callback at unexpected time. ???");
 | |
|                 return;
 | |
|             }
 | |
| 
 | |
|             _popover.CanvasGroup.alpha = 1f;
 | |
|         }
 | |
| 
 | |
|         protected override void Awake()
 | |
|         {
 | |
|             base.Awake();
 | |
| 
 | |
|             CachedTransform.SetParent(Hierarchy.Get("SRDebugger"));
 | |
|         }
 | |
| 
 | |
|         private void Load()
 | |
|         {
 | |
|             var popoverPrefab = Resources.Load<BugReportPopoverRoot>(SRDebugPaths.BugReportPopoverPath);
 | |
|             var sheetPrefab = Resources.Load<BugReportSheetController>(SRDebugPaths.BugReportSheetPath);
 | |
| 
 | |
|             if (popoverPrefab == null)
 | |
|             {
 | |
|                 Debug.LogError("[SRDebugger] Unable to load bug report popover prefab");
 | |
|                 return;
 | |
|             }
 | |
| 
 | |
|             if (sheetPrefab == null)
 | |
|             {
 | |
|                 Debug.LogError("[SRDebugger] Unable to load bug report sheet prefab");
 | |
|                 return;
 | |
|             }
 | |
| 
 | |
|             _popover = SRInstantiate.Instantiate(popoverPrefab);
 | |
|             _popover.CachedTransform.SetParent(CachedTransform, false);
 | |
| 
 | |
|             _sheet = SRInstantiate.Instantiate(sheetPrefab);
 | |
|             _sheet.CachedTransform.SetParent(_popover.Container, false);
 | |
| 
 | |
|             _sheet.SubmitComplete = SubmitComplete;
 | |
|             _sheet.CancelPressed = CancelPressed;
 | |
| 
 | |
|             _sheet.TakingScreenshot = TakingScreenshot;
 | |
|             _sheet.ScreenshotComplete = ScreenshotComplete;
 | |
| 
 | |
|             _popover.CachedGameObject.SetActive(false);
 | |
|         }
 | |
|     }
 | |
| }
 |