using System; using System.Collections.Generic; using System.Linq; using SRDebugger.Internal; using SRDebugger.UI.Controls; using SRF; using SRF.Service; using UnityEngine; namespace SRDebugger.Services.Implementation { [Service(typeof(IPinEntryService))] public class PinEntryServiceImpl : SRServiceBase, IPinEntryService { private PinEntryCompleteCallback _callback; private bool _isVisible; private PinEntryControl _pinControl; private List _requiredPin = new List(4); public bool IsShowingKeypad { get { return _isVisible; } } public void ShowPinEntry(IList 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(); } protected override void Awake() { base.Awake(); base.CachedTransform.SetParent(Hierarchy.Get("SRDebugger")); } private void Load() { PinEntryControl pinEntryControl = Resources.Load("SRDebugger/UI/Prefabs/PinEntry"); if (pinEntryControl == null) { Debug.LogError("[PinEntry] Unable to load pin entry prefab"); return; } _pinControl = SRInstantiate.Instantiate(pinEntryControl); _pinControl.CachedTransform.SetParent(base.CachedTransform, false); _pinControl.Hide(); _pinControl.Complete += PinControlOnComplete; } private void PinControlOnComplete(IList result, bool didCancel) { bool flag = _requiredPin.SequenceEqual(result); if (!didCancel && !flag) { _pinControl.Clear(); _pinControl.PlayInvalidCodeAnimation(); return; } _isVisible = false; _pinControl.Hide(); if (didCancel) { _callback(false); } else { _callback(flag); } } private void VerifyPin(IList pin) { if (pin.Count != 4) { throw new ArgumentException("Pin list must have 4 elements"); } for (int i = 0; i < pin.Count; i++) { if (pin[i] < 0 || pin[i] > 9) { throw new ArgumentException("Pin numbers must be >= 0 && <= 9"); } } } [Obsolete] public void ShowPinEntry(IList requiredPin, string message, PinEntryCompleteCallback callback, bool blockInput, bool allowCancel) { ShowPinEntry(requiredPin, message, callback, allowCancel); } } }