PlayerManager.cs 6.81 KB
//Log Dir		 http://docs.unity3d.com/Manual/LogFiles.html

// requisiçao http get no unity
// vlibras.lavid.ufpb.br:5000/glosa?texto=CASA%LAVID%123	
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using System;
using System.IO;
using System.Text;
using System.Runtime.InteropServices;
using UnityEngine.UI;
using System.Threading;

public class PlayerManager : GenericPlayerManager {

#if UNITY_IOS
	//private const string BASE_URL = "http://150.165.205.9/anims/IOS/";//old
    private const string BASE_URL = "http://dicionario.vlibras.gov.br/IOS/";
#else
    //private const string BASE_URL = "http://150.165.205.9/anims/ANDROID/";//old
    private const string BASE_URL = "http://dicionario.vlibras.gov.br/ANDROID/";
#endif

	//private const string SERVER_URL = "http://vlibras.lavid.ufpb.br/glosa?texto=";//old
	private const string SERVER_URL = "http://traducao.vlibras.gov.br/translate?text=";
	private const int version = 1;

    public enum ERROR_STATUS_MESSAGE
    {
        INTERNET_CONNECTION_FAILURE,
        TRANSLATOR_CONNECTION_FAILURE,
        CONNECTION_TIMEOUT_FAILURE
    }

    public static string get_connection_status_message(ERROR_STATUS_MESSAGE msg)
    {
        switch(msg)
        {
            case ERROR_STATUS_MESSAGE.TRANSLATOR_CONNECTION_FAILURE:
                return "Problema na conexão. Usaremos português sinalizado e datilologia.";
            case ERROR_STATUS_MESSAGE.INTERNET_CONNECTION_FAILURE:
                return "Não há acesso à internet. Usaremos português sinalizado e datilologia.";
            case ERROR_STATUS_MESSAGE.CONNECTION_TIMEOUT_FAILURE:
                return "Não há acesso à internet. Usaremos português sinalizado e datilologia.";
                //return "A conexão está lenta. Usaremos português sinalizado e datilologia.";
            default:
                return "Ocorreu um erro. Estamos trabalhando para solucioná-lo!";
        }

    }

    protected VoiceRecognition voiceRecognizer;
	public InputField translateScreenText;

	private string[] randomAnimationNames = new string[] {
		"[RELAXAR]",
		"[BOCEJAR]",
		"[COCHILAR]",
		"[ESPREGUI_ADA]"
	};

	public ScreenManager screenManager;

	private string dictWord = null;

	public override void Start()
	{
        
		base.setRandomAnimations(randomAnimationNames);
		base.Start();

		// DEBUG: var onLoadPlayer = function(){}
		// Application.ExternalCall("onLoadPlayer");
		voiceRecognizer = new VoiceRecognition();

		Screen.fullScreen = false;
		// Hide input text preview
		TouchScreenKeyboard.hideInput = true;
	}

	public void playDict(string word)
	{
		Debug.Log("Requesting dictionary: " + word);

		this.dictWord = word;
		base.gloss = word;
		base.playNow(word);

		this.screenManager.hideScreen();
		this.screenManager.setPauseMenuState(false);
	}

	public void playTranslate()
	{
		stopTranslation();

		string text = translateScreenText.text;
		translateScreenText.text = "";

		StartCoroutine("translate", text);

		this.screenManager.setPauseMenuState(false);
	}

	public void stopTranslation()
	{
		StopCoroutine("translate");
		this.randomAnimations.unlockFor("translate");
	}

	public void catchTranslationError()
	{
		this.randomAnimations.unlockFor("translate");
		base.repeat();
	}

	protected override WWW loadAssetBundle(string aniName)
	{
		Debug.Log("Requesting bundle: " + aniName);
		return WWW.LoadFromCacheOrDownload(BASE_URL + aniName, version);
	}

	private System.Object LOCKER_STATE = new System.Object();

	protected override void onPlayingStateChange()
	{
		lock (LOCKER_STATE) {
			this.screenManager.changeStates(base.isPlaying(), base.isPaused(), ! String.IsNullOrEmpty(base.gloss));
		}
	}

	protected override void onConnectionError(string gloss, string word)
	{
		if (gloss.Equals(this.dictWord))
		{
			base.stopAll();
            this.screenManager.showConnectionErrorDialog(
                PlayerManager.ERROR_STATUS_MESSAGE.INTERNET_CONNECTION_FAILURE);
		}
	}

	// Called from microphone icon at main interface
	public void callVoiceRecognizer()
	{
		Debug.Log("Requesting voice recognizer");
		
		string gloss = voiceRecognizer.callRecognition();
		this.translateScreenText.text = gloss;
		Debug.Log("Voice recognizer answer: " + gloss);

		this.screenManager.switchScreen("translate");
	}

	private System.Object LOCKER_TRANSLATE = new System.Object();

	private IEnumerator translate(string gloss)
	{
		lock (this.LOCKER_TRANSLATE)
		{
            bool returnSuccess = true;
            bool timeout = false;

            Debug.Log("Requesting translator: " + gloss);

			base.randomAnimations.lockFor("translate");
			this.screenManager.setLoadingSnippetState(true);

			WWW glossRequest = new WWW(SERVER_URL + WWW.EscapeURL(gloss));
            
			if (glossRequest != null)
			{
				const float timeoutLimit = 10f;
                float timer = 0;

                while (!glossRequest.isDone)
                {
                    if (timer > timeoutLimit)
                    {
                        timeout = true;
                        break;
                    }

                    timer += Time.deltaTime;
                    yield return null;
                }

				if (!timeout)
				{
					if (glossRequest.error == null)
					{
						returnSuccess = glossRequest.responseHeaders.Count > 0 && glossRequest.responseHeaders["STATUS"].EndsWith("200 OK");

						if (returnSuccess)
						{
							if (!String.IsNullOrEmpty(glossRequest.text))
							{
								Debug.Log("Translator answer: " + glossRequest.text);

								base.gloss = glossRequest.text;
								base.playNow(glossRequest.text);
								this.screenManager.setLoadingSnippetState(false);
								base.randomAnimations.unlockFor("translate");

								yield break;
							}
							else Debug.Log("Error at PlayerManager.translate: empty answer.");
						}
						else Debug.Log("Error at PlayerManager.translate: unsuccessful answer.");
					}
					else Debug.Log("Error at PlayerManager.translate: (WWW) glosaRequest: " + glossRequest.error);
				}
				else Debug.Log("Error at PlayerManager.translate: timeout.");
			}
			else Debug.Log ("Error at PlayerManager.translate: (WWW) glosaRequest is NULL.");

			base.gloss = gloss.ToUpper();

			this.screenManager.setLoadingSnippetState(false);
            base.randomAnimations.unlockFor("translate");

            if (returnSuccess)
            {
                this.screenManager.showConnectionErrorDialog(
                    PlayerManager.ERROR_STATUS_MESSAGE.TRANSLATOR_CONNECTION_FAILURE);
            }
            else if (timeout)
            {
                this.screenManager.showConnectionErrorDialog(
                    PlayerManager.ERROR_STATUS_MESSAGE.CONNECTION_TIMEOUT_FAILURE);
            }
            else
            {
                this.screenManager.showConnectionErrorDialog(
                    PlayerManager.ERROR_STATUS_MESSAGE.INTERNET_CONNECTION_FAILURE);
            }
        }
	}

}