138 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			C#
		
	
	
	
		
		
			
		
	
	
			138 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			C#
		
	
	
	
|  | namespace SRDebugger.Services.Implementation | |||
|  | { | |||
|  |     using System; | |||
|  |     using System.Collections.Generic; | |||
|  |     using System.Linq; | |||
|  |     using Internal; | |||
|  |     using SRF; | |||
|  |     using SRF.Service; | |||
|  |     using UI.Controls; | |||
|  |     using UnityEngine; | |||
|  | 
 | |||
|  |     [Service(typeof (IPinEntryService))] | |||
|  |     public class PinEntryServiceImpl : SRServiceBase<IPinEntryService>, IPinEntryService | |||
|  |     { | |||
|  |         private PinEntryCompleteCallback _callback; | |||
|  |         private bool _isVisible; | |||
|  |         private PinEntryControl _pinControl; | |||
|  |         private List<int> _requiredPin = new List<int>(4); | |||
|  | 
 | |||
|  |         public bool IsShowingKeypad | |||
|  |         { | |||
|  |             get { return _isVisible; } | |||
|  |         } | |||
|  | 
 | |||
|  |         public void ShowPinEntry(IList<int> requiredPin, string message, PinEntryCompleteCallback callback, | |||
|  |             bool allowCancel = true) | |||
|  |         { | |||
|  |             if (_isVisible) | |||
|  |             { | |||
|  |                 throw new InvalidOperationException("Pin entry is already in progress"); | |||
|  |             } | |||
|  | 
 | |||
|  |             VerifyPin(requiredPin); | |||
|  | 
 | |||
|  |             if (_pinControl == null) | |||
|  |             { | |||
|  |                 Load(); | |||
|  |             } | |||
|  | 
 | |||
|  |             if (_pinControl == null) | |||
|  |             { | |||
|  |                 Debug.LogWarning("[PinEntry] Pin entry failed loading, executing callback with fail result"); | |||
|  |                 callback(false); | |||
|  |                 return; | |||
|  |             } | |||
|  | 
 | |||
|  |             _pinControl.Clear(); | |||
|  |             _pinControl.PromptText.text = message; | |||
|  | 
 | |||
|  |             _pinControl.CanCancel = allowCancel; | |||
|  | 
 | |||
|  |             _callback = callback; | |||
|  | 
 | |||
|  |             _requiredPin.Clear(); | |||
|  |             _requiredPin.AddRange(requiredPin); | |||
|  | 
 | |||
|  |             _pinControl.Show(); | |||
|  | 
 | |||
|  |             _isVisible = true; | |||
|  | 
 | |||
|  |             SRDebuggerUtil.EnsureEventSystemExists(); | |||
|  |         } | |||
|  | 
 | |||
|  |         [Obsolete] | |||
|  |         public void ShowPinEntry(IList<int> requiredPin, string message, PinEntryCompleteCallback callback, | |||
|  |             bool blockInput, | |||
|  |             bool allowCancel) | |||
|  |         { | |||
|  |             ShowPinEntry(requiredPin, message, callback, allowCancel); | |||
|  |         } | |||
|  | 
 | |||
|  |         protected override void Awake() | |||
|  |         { | |||
|  |             base.Awake(); | |||
|  | 
 | |||
|  |             CachedTransform.SetParent(Hierarchy.Get("SRDebugger")); | |||
|  |         } | |||
|  | 
 | |||
|  |         private void Load() | |||
|  |         { | |||
|  |             var prefab = Resources.Load<PinEntryControl>(SRDebugPaths.PinEntryPrefabPath); | |||
|  | 
 | |||
|  |             if (prefab == null) | |||
|  |             { | |||
|  |                 Debug.LogError("[PinEntry] Unable to load pin entry prefab"); | |||
|  |                 return; | |||
|  |             } | |||
|  | 
 | |||
|  |             _pinControl = SRInstantiate.Instantiate(prefab); | |||
|  |             _pinControl.CachedTransform.SetParent(CachedTransform, false); | |||
|  | 
 | |||
|  |             _pinControl.Hide(); | |||
|  | 
 | |||
|  |             _pinControl.Complete += PinControlOnComplete; | |||
|  |         } | |||
|  | 
 | |||
|  |         private void PinControlOnComplete(IList<int> result, bool didCancel) | |||
|  |         { | |||
|  |             var isValid = _requiredPin.SequenceEqual(result); | |||
|  | 
 | |||
|  |             if (!didCancel && !isValid) | |||
|  |             { | |||
|  |                 _pinControl.Clear(); | |||
|  |                 _pinControl.PlayInvalidCodeAnimation(); | |||
|  | 
 | |||
|  |                 return; | |||
|  |             } | |||
|  | 
 | |||
|  |             _isVisible = false; | |||
|  |             _pinControl.Hide(); | |||
|  | 
 | |||
|  |             if (didCancel) | |||
|  |             { | |||
|  |                 _callback(false); | |||
|  |                 return; | |||
|  |             } | |||
|  | 
 | |||
|  |             _callback(isValid); | |||
|  |         } | |||
|  | 
 | |||
|  |         private void VerifyPin(IList<int> pin) | |||
|  |         { | |||
|  |             if (pin.Count != 4) | |||
|  |             { | |||
|  |                 throw new ArgumentException("Pin list must have 4 elements"); | |||
|  |             } | |||
|  | 
 | |||
|  |             for (var i = 0; i < pin.Count; i++) | |||
|  |             { | |||
|  |                 if (pin[i] < 0 || pin[i] > 9) | |||
|  |                 { | |||
|  |                     throw new ArgumentException("Pin numbers must be >= 0 && <= 9"); | |||
|  |                 } | |||
|  |             } | |||
|  |         } | |||
|  |     } | |||
|  | } |