package nliveroid.nlr.main;
import android.content.Context;
import android.os.AsyncTask;
import android.preference.DialogPreference;
import android.util.AttributeSet;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.FrameLayout;
import android.widget.Spinner;
public class SpeechTestPreference extends DialogPreference{
private Context context;
private static SpeechTestPreference me;
private int width;
private static Spinner phontSpinner;
private FrameLayout progressPane;
private Speechable mSpeech;
private boolean ENDFLAG = true;
public SpeechTestPreference(final Context context,AttributeSet attrs) {
super(context, attrs);
this.context = context;
this.me = this;
}
@Override
protected View onCreateDialogView() {
//Aquesの時の声色
View view = (View)LayoutInflater.from(context).inflate(R.layout.speech_test, null);
ArrayAdapter adapter = ArrayAdapter.createFromResource(context, R.array.speech_phont,
android.R.layout.simple_spinner_item);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
phontSpinner = (Spinner)view.findViewById(R.id.speech_test_spinner);
phontSpinner.setAdapter(adapter);
int defaultValue = ((Details)context).getDetailMapValue("speech_aques_phont") == null? 0:Integer.parseInt(((Details)context).getDetailMapValue("speech_aques_phont"));
phontSpinner.setSelection(defaultValue);
String speech_enable = Details.getPref().getDetailMapValue("speech_enable");
if(speech_enable == null||(speech_enable != null && speech_enable.equals(""))){
//何故かnullなら一応有効にしておく
}else {
if(speech_enable.equals("0")||speech_enable.equals("1")){//TTSの時
phontSpinner.setEnabled(false);
}
}
final EditText et = (EditText)view.findViewById(R.id.speech_test_et);
//playボタン
Button play = (Button)view.findViewById(R.id.speech_test_bt);
play.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View v) {
String text = et.getText().toString();
if(text != null && !text.equals("")){
if(progressPane != null)progressPane.setVisibility(View.VISIBLE);
new TestSpeech().execute(text);
}
}
});
progressPane = (FrameLayout)view.findViewById(R.id.speech_test_progress);
return view;
}
public static void setEnable_(boolean isEnable ,boolean isPhontEnable){
if(me!=null)me.setEnabled(isEnable);
if(phontSpinner != null)phontSpinner.setEnabled(isPhontEnable);
}
@Override
protected void onDialogClosed(boolean positiveResult) {
super.onDialogClosed(positiveResult);
if(mSpeech != null){
mSpeech.destroy();
mSpeech = null;
}
if(positiveResult){
if(context == null)return;
NLiveRoid app = (NLiveRoid)context.getApplicationContext();
if(app != null)app.setDetailsMapValue("speech_aques_phont", String.valueOf(phontSpinner.getSelectedItemPosition()));
}
}
class TestSpeech extends AsyncTask<String,Void,Void>{
@Override
protected Void doInBackground(String... params) {
if(context == null)return null;//ここの場合、トーストもできないっぽい気がするので何もしない
NLiveRoid app = (NLiveRoid) context.getApplicationContext();
if(app == null)return null;
String enable = app.getDetailsMapValue("speech_enable");
if(enable.equals("1")){
int speed = Integer.parseInt(app.getDetailsMapValue("speech_speed"));
int pich = Integer.parseInt(app.getDetailsMapValue("speech_pich"));
if(mSpeech == null){
mSpeech = new TTSSpeech("", 1);
mSpeech.setContext(((NLiveRoid)context.getApplicationContext()).getForeACT(), speed , pich );//ここはAquesと違って、appのbaseContextじゃないと初期化されない!!!!
}
waitInitilize();
if(mSpeech == null)return null;
mSpeech.setSpeed(speed);
mSpeech.setPich(pich);
}else if(enable.equals("3")){
int speed = Integer.parseInt(app.getDetailsMapValue("speech_speed"));
int phont = phontSpinner.getSelectedItemPosition();
byte vol = Byte.parseByte(app.getDetailsMapValue("speech_aques_vol"));
if(mSpeech == null){
mSpeech = new AquesSpeech("", 1,vol);
mSpeech.setContext(((NLiveRoid)context.getApplicationContext()).getForeACT(),speed , phont);
}
waitInitilize();
mSpeech.setSpeed(speed);
mSpeech.setPich(phont);
((AquesSpeech)mSpeech).setVolume(vol);
}
// Log.d("Log","DARUI ---- " + params[0]);
try {
mSpeech.addSpeech(params[0]);
} catch (InterruptedException e) {
e.printStackTrace();
}catch(NullPointerException e){
// e.printStackTrace();//onDialogClosedでnullにしたタイミングがある
}
return null;
}
@Override
protected void onPostExecute(Void arg){
if(progressPane != null){
progressPane.setVisibility(View.GONE);
}
}
private void waitInitilize(){
//初期化されるまで待つ
while(ENDFLAG){
try {
Thread.sleep(1000);
Log.d("Log","IS" + mSpeech.isInitalized());
if(mSpeech.isInitalized()){
break;
}
} catch (InterruptedException e) {
e.printStackTrace();
ENDFLAG = false;
break;
}catch(NullPointerException e){
// e.printStackTrace();//onDialogClosedでnullにしたタイミングがある
ENDFLAG = false;
break;
}catch(Exception e){
e.printStackTrace();
ENDFLAG = false;
break;
}
}
}
}
}