public static void textToSpeech(String text, long did, int ord, int qa) { mTextToSpeak = text; mQuestionAnswer = qa; mDid = did; mOrd = ord; Timber.d("ReadText.textToSpeech() method started for string '%s'", text); // get the user's existing language preference String language = getLanguage(mDid, mOrd, mQuestionAnswer); Timber.d("ReadText.textToSpeech() method found language choice '%s'", language); // rebuild the language list if it's empty if (availableTtsLocales.isEmpty()) { buildAvailableLanguages(); } // Check, if stored language is available for (int i = 0; i < availableTtsLocales.size(); i++) { if (language.equals(NO_TTS)) { // user has chosen not to read the text return; } else if (language.equals(availableTtsLocales.get(i).getISO3Language())) { speak(mTextToSpeak, language); return; } } // Otherwise ask the user what language they want to use Resources res = mReviewer.get().getResources(); final StyledDialog.Builder builder = new StyledDialog.Builder(mReviewer.get()); if (availableTtsLocales.size() == 0) { // builder.setTitle(res.getString(R.string.no_tts_available_title)); Timber.w("ReadText.textToSpeech() no TTS languages available"); builder.setMessage(res.getString(R.string.no_tts_available_message)); builder.setIcon(R.drawable.ic_dialog_alert); builder.setPositiveButton(res.getString(R.string.dialog_ok), null); } else { ArrayList<CharSequence> dialogItems = new ArrayList<CharSequence>(); final ArrayList<String> dialogIds = new ArrayList<String>(); builder.setTitle(R.string.select_locale_title); // Add option: "no tts" dialogItems.add(res.getString(R.string.tts_no_tts)); dialogIds.add(NO_TTS); for (int i = 0; i < availableTtsLocales.size(); i++) { dialogItems.add(availableTtsLocales.get(i).getDisplayName()); dialogIds.add(availableTtsLocales.get(i).getISO3Language()); } String[] items = new String[dialogItems.size()]; dialogItems.toArray(items); builder.setItems( items, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { String locale = dialogIds.get(which); Timber.d("ReadText.textToSpeech() user chose locale '%s'", locale); if (!locale.equals(NO_TTS)) { speak(mTextToSpeak, locale); } MetaDB.storeLanguage(mReviewer.get(), mDid, mOrd, mQuestionAnswer, locale); } }); } // Show the dialog after short delay so that user gets a chance to preview the card final Handler handler = new Handler(); final int delay = 500; handler.postDelayed( new Runnable() { @Override public void run() { builder.create().show(); } }, delay); }