package cri.sanity.screen; import android.content.ComponentName; import android.content.Intent; import android.os.Bundle; import android.os.Handler; import android.speech.tts.TextToSpeech; import android.widget.Toast; import cri.sanity.*; import cri.sanity.pref.*; import cri.sanity.util.*; public class TtsActivity extends ScreenActivity { private static final String KEY_GLOBAL = "tts_global"; private static final String KEY_TEST = "tts_test"; private static final String KEY_FILTER = "filter_tts"; private static final String KEY_SMS_FILTER = "filter_ttsms"; private static final String KEY_SMS_SHARED = "ttsms_shared"; private static final String KEY_VOL = K.TTS_VOL + K.WS; private static final String KEY_SMS_VOL = K.TTS_SMS_VOL + K.WS; private static final int CODE_CHECK = 1; private static final int TEST_MIN_REPEAT = 10; private static final int TEST_MAX_REPEAT = 10; private static final String TEST_TXT_REPEAT = A.name(); private TTS tts; private Handler handler; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); handler = new Handler(); on(K.TTS, new Change(){ public boolean on(){ if(!(Boolean)value) return true; try { startActivityForResult(new Intent(TextToSpeech.Engine.ACTION_CHECK_TTS_DATA), CODE_CHECK); } catch(Exception e) { ttsBroken(); } return false; }}); if(A.is(K.TTS_SOLO)) fixAudio(); on(K.TTS_SOLO, new Change(){ public boolean on(){ if((Boolean)value) fixAudio(); return true; }}); on(K.TTS_STREAM, new Change(){ public boolean on(){ final boolean alt = (Boolean)value; final int stream = getVolumeStream(alt); int vol = A.geti(K.TTS_VOL); if(vol >= 0) { final int volmax = A.audioMan().getStreamMaxVolume(stream); if(vol > volmax) { A.put(K.TTS_VOL, volmax); ((PList)pref(KEY_VOL)).setValue(volmax); } } vol = A.geti(K.TTS_SMS_VOL); if(vol >= 0) { final int volmax = A.audioMan().getStreamMaxVolume(stream); if(vol > volmax) { A.put(K.TTS_VOL, volmax); ((PList)pref(KEY_SMS_VOL)).setValue(volmax); } } setVolumeLevels (stream); setVolumeLevelsSMS(stream); return true; }}); setVolumeLevels(); setVolumeLevelsSMS(); on(KEY_GLOBAL, new Click(){ public boolean on(){ Intent i = new Intent(); i.addCategory(Intent.CATEGORY_LAUNCHER); i.setComponent(new ComponentName("com.android.settings", "com.android.settings.TextToSpeechSettings")); i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); try { startActivity(i); } catch(Exception e) {} return true; }}); on(KEY_TEST, new Click(){ public boolean on(){ pref.setEnabled(false); ttsFree(); tts = new TTS(TEST_TXT_REPEAT, false, false, false) { @Override protected void onError() { A.toast(R.string.err_tts_init); } @Override public void onInit(int status) { super.onInit(status); if(repeat <= 0) return; if(repeat > TEST_MAX_REPEAT) repeat = TEST_MIN_REPEAT; Toast.makeText(A.app(), A.s(R.string.announce)+": \""+id+'"', Toast.LENGTH_LONG).show(); } @Override public void onUtteranceCompleted(String idUtter) { super.onUtteranceCompleted(idUtter); if(repeat <= 0) handler.post(new Runnable() { @Override public void run() { ttsFree(); pref.setEnabled(true); } }); } }; return true; }}); on(KEY_SMS_SHARED, new Change(){ public boolean on(){ final boolean on = (Boolean)value; final PFilter p = prefSmsFilter(); p.updateSum(!on); p.setEnabled(!on); return true; }}); fullOnly(K.TTS_HEADSET, K.TTS_SOLO, KEY_VOL, KEY_SMS_VOL, K.TTS_REPEAT+K.WS, K.TTS_PAUSE+K.WS, KEY_FILTER, K.TTS_SMS_PREFIX, K.TTS_SMS_SUFFIX, KEY_SMS_SHARED, KEY_SMS_FILTER); } @Override public void onResume() { super.onResume(); setChecked(KEY_SMS_SHARED, !A.is(K.TTS_SMS_FILTER)); } @Override public void onPause() { ttsFree(); super.onPause(); } @Override protected void onActivityResult(int request, int res, Intent i) { if(request != CODE_CHECK) return; if(res == TextToSpeech.Engine.CHECK_VOICE_DATA_PASS) setChecked(K.TTS, true); else { Alert.msg( A.rawstr(R.raw.tts_install), new Alert.Click(){ public void on(){ try { startActivity(new Intent(TextToSpeech.Engine.ACTION_INSTALL_TTS_DATA)); } catch(Exception e) { ttsBroken(); } }}, null, Alert.OKCANC ); } } public static final int getVolumeStream() { return getVolumeStream (A.is(K.TTS_STREAM)); } public static final int getVolumeStreamSMS() { return getVolumeStreamSMS(A.is(K.TTS_STREAM)); } private static final int getVolumeStream (boolean alt) { return alt? TTS.STREAM2_INT : TTS.STREAM1_INT; } private static final int getVolumeStreamSMS(boolean alt) { return alt? TTS.STREAM3_INT : TTS.STREAM1_INT; } private void setVolumeLevels (int stream) { VolumeActivity.setVolumeLevels((PList)pref(KEY_VOL ), stream); } private void setVolumeLevelsSMS(int stream) { VolumeActivity.setVolumeLevels((PList)pref(KEY_SMS_VOL), stream); } private void setVolumeLevels() { setVolumeLevels (getVolumeStream ()); } private void setVolumeLevelsSMS() { setVolumeLevelsSMS(getVolumeStreamSMS()); } private void ttsBroken() { Alert.msg(A.rawstr(R.raw.tts_broken)); } private void ttsFree() { if(tts == null) return; tts.shutdown(); tts = null; } private PFilter prefSmsFilter() { return (PFilter)pref(KEY_SMS_FILTER); } private void fixAudio() { if(isAudioWarn()) setChecked(K.TTS_STREAM, true); } private static boolean isAudioWarn() { return !A.is(K.TTS_STREAM) && Dev.getSysInt("notifications_use_ring_volume")>0; } }