You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
CrowdControl/Assets/3rd/StompyRobot/SRDebugger/Scripts/Services/Implementation/PinEntryServiceImpl.cs

138 lines
3.6 KiB
C#

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