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