18e65b64e60cfcf07acafecbde5a750bdcfdc2df1Przemyslaw Szczepaniakpackage android.support.v4.speech.tts; 2c7afe28d24010fb0552a5ba7fb7b15ad507d587cPrzemyslaw Szczepaniak 3c7afe28d24010fb0552a5ba7fb7b15ad507d587cPrzemyslaw Szczepaniakimport android.speech.tts.TextToSpeech; 4c7afe28d24010fb0552a5ba7fb7b15ad507d587cPrzemyslaw Szczepaniakimport android.speech.tts.UtteranceProgressListener; 5c7afe28d24010fb0552a5ba7fb7b15ad507d587cPrzemyslaw Szczepaniakimport android.speech.tts.TextToSpeech.OnUtteranceCompletedListener; 6c7afe28d24010fb0552a5ba7fb7b15ad507d587cPrzemyslaw Szczepaniak 7c7afe28d24010fb0552a5ba7fb7b15ad507d587cPrzemyslaw Szczepaniakimport java.util.Locale; 8c7afe28d24010fb0552a5ba7fb7b15ad507d587cPrzemyslaw Szczepaniakimport java.util.Set; 9c7afe28d24010fb0552a5ba7fb7b15ad507d587cPrzemyslaw Szczepaniak 10c7afe28d24010fb0552a5ba7fb7b15ad507d587cPrzemyslaw Szczepaniak/** Helper class for TTS functionality introduced in ICS MR1 */ 11c7afe28d24010fb0552a5ba7fb7b15ad507d587cPrzemyslaw Szczepaniakclass TextToSpeechICSMR1 { 12c7afe28d24010fb0552a5ba7fb7b15ad507d587cPrzemyslaw Szczepaniak /** 13c7afe28d24010fb0552a5ba7fb7b15ad507d587cPrzemyslaw Szczepaniak * Call {@link TextToSpeech#getFeatures} if available. 14c7afe28d24010fb0552a5ba7fb7b15ad507d587cPrzemyslaw Szczepaniak * 15c7afe28d24010fb0552a5ba7fb7b15ad507d587cPrzemyslaw Szczepaniak * @return {@link TextToSpeech#getFeatures} or null on older devices. 16c7afe28d24010fb0552a5ba7fb7b15ad507d587cPrzemyslaw Szczepaniak */ 17c7afe28d24010fb0552a5ba7fb7b15ad507d587cPrzemyslaw Szczepaniak static Set<String> getFeatures(TextToSpeech tts, Locale locale) { 18c7afe28d24010fb0552a5ba7fb7b15ad507d587cPrzemyslaw Szczepaniak if (android.os.Build.VERSION.SDK_INT >= 19c7afe28d24010fb0552a5ba7fb7b15ad507d587cPrzemyslaw Szczepaniak android.os.Build.VERSION_CODES.ICE_CREAM_SANDWICH_MR1) { 20c7afe28d24010fb0552a5ba7fb7b15ad507d587cPrzemyslaw Szczepaniak return tts.getFeatures(locale); 21c7afe28d24010fb0552a5ba7fb7b15ad507d587cPrzemyslaw Szczepaniak } 22c7afe28d24010fb0552a5ba7fb7b15ad507d587cPrzemyslaw Szczepaniak return null; 23c7afe28d24010fb0552a5ba7fb7b15ad507d587cPrzemyslaw Szczepaniak } 24c7afe28d24010fb0552a5ba7fb7b15ad507d587cPrzemyslaw Szczepaniak 258e65b64e60cfcf07acafecbde5a750bdcfdc2df1Przemyslaw Szczepaniak public static final String KEY_FEATURE_EMBEDDED_SYNTHESIS = "embeddedTts"; 268e65b64e60cfcf07acafecbde5a750bdcfdc2df1Przemyslaw Szczepaniak public static final String KEY_FEATURE_NETWORK_SYNTHESIS = "networkTts"; 278e65b64e60cfcf07acafecbde5a750bdcfdc2df1Przemyslaw Szczepaniak 28c7afe28d24010fb0552a5ba7fb7b15ad507d587cPrzemyslaw Szczepaniak static interface UtteranceProgressListenerICSMR1 { 29c7afe28d24010fb0552a5ba7fb7b15ad507d587cPrzemyslaw Szczepaniak void onDone(String utteranceId); 30c7afe28d24010fb0552a5ba7fb7b15ad507d587cPrzemyslaw Szczepaniak void onError(String utteranceId); 31c7afe28d24010fb0552a5ba7fb7b15ad507d587cPrzemyslaw Szczepaniak void onStart(String utteranceId); 32c7afe28d24010fb0552a5ba7fb7b15ad507d587cPrzemyslaw Szczepaniak } 33c7afe28d24010fb0552a5ba7fb7b15ad507d587cPrzemyslaw Szczepaniak 34c7afe28d24010fb0552a5ba7fb7b15ad507d587cPrzemyslaw Szczepaniak /** 35c7afe28d24010fb0552a5ba7fb7b15ad507d587cPrzemyslaw Szczepaniak * Call {@link TextToSpeech#setOnUtteranceProgressListener} if ICS-MR1 or newer. 36c7afe28d24010fb0552a5ba7fb7b15ad507d587cPrzemyslaw Szczepaniak * 37c7afe28d24010fb0552a5ba7fb7b15ad507d587cPrzemyslaw Szczepaniak * On pre ICS-MR1 devices,{@link TextToSpeech#setOnUtteranceCompletedListener} is 38c7afe28d24010fb0552a5ba7fb7b15ad507d587cPrzemyslaw Szczepaniak * used to emulate its behavior - at the end of synthesis we call 39c7afe28d24010fb0552a5ba7fb7b15ad507d587cPrzemyslaw Szczepaniak * {@link UtteranceProgressListenerICSMR1#onStart(String)} and 40c7afe28d24010fb0552a5ba7fb7b15ad507d587cPrzemyslaw Szczepaniak * {@link UtteranceProgressListenerICSMR1#onDone(String)} one after the other. 41c7afe28d24010fb0552a5ba7fb7b15ad507d587cPrzemyslaw Szczepaniak * Errors can't be detected. 42c7afe28d24010fb0552a5ba7fb7b15ad507d587cPrzemyslaw Szczepaniak */ 43c7afe28d24010fb0552a5ba7fb7b15ad507d587cPrzemyslaw Szczepaniak static void setUtteranceProgressListener(TextToSpeech tts, 44c7afe28d24010fb0552a5ba7fb7b15ad507d587cPrzemyslaw Szczepaniak final UtteranceProgressListenerICSMR1 listener) { 45c7afe28d24010fb0552a5ba7fb7b15ad507d587cPrzemyslaw Szczepaniak if (android.os.Build.VERSION.SDK_INT >= 46c7afe28d24010fb0552a5ba7fb7b15ad507d587cPrzemyslaw Szczepaniak android.os.Build.VERSION_CODES.ICE_CREAM_SANDWICH_MR1) { 47c7afe28d24010fb0552a5ba7fb7b15ad507d587cPrzemyslaw Szczepaniak tts.setOnUtteranceProgressListener(new UtteranceProgressListener() { 48c7afe28d24010fb0552a5ba7fb7b15ad507d587cPrzemyslaw Szczepaniak @Override 49c7afe28d24010fb0552a5ba7fb7b15ad507d587cPrzemyslaw Szczepaniak public void onStart(String utteranceId) { 50c7afe28d24010fb0552a5ba7fb7b15ad507d587cPrzemyslaw Szczepaniak listener.onStart(utteranceId); 51c7afe28d24010fb0552a5ba7fb7b15ad507d587cPrzemyslaw Szczepaniak } 52c7afe28d24010fb0552a5ba7fb7b15ad507d587cPrzemyslaw Szczepaniak 53c7afe28d24010fb0552a5ba7fb7b15ad507d587cPrzemyslaw Szczepaniak @Override 54c7afe28d24010fb0552a5ba7fb7b15ad507d587cPrzemyslaw Szczepaniak public void onError(String utteranceId) { 55c7afe28d24010fb0552a5ba7fb7b15ad507d587cPrzemyslaw Szczepaniak listener.onError(utteranceId); 56c7afe28d24010fb0552a5ba7fb7b15ad507d587cPrzemyslaw Szczepaniak } 57c7afe28d24010fb0552a5ba7fb7b15ad507d587cPrzemyslaw Szczepaniak 58c7afe28d24010fb0552a5ba7fb7b15ad507d587cPrzemyslaw Szczepaniak @Override 59c7afe28d24010fb0552a5ba7fb7b15ad507d587cPrzemyslaw Szczepaniak public void onDone(String utteranceId) { 60c7afe28d24010fb0552a5ba7fb7b15ad507d587cPrzemyslaw Szczepaniak listener.onDone(utteranceId); 61c7afe28d24010fb0552a5ba7fb7b15ad507d587cPrzemyslaw Szczepaniak } 62c7afe28d24010fb0552a5ba7fb7b15ad507d587cPrzemyslaw Szczepaniak }); 63c7afe28d24010fb0552a5ba7fb7b15ad507d587cPrzemyslaw Szczepaniak } else { 64c7afe28d24010fb0552a5ba7fb7b15ad507d587cPrzemyslaw Szczepaniak tts.setOnUtteranceCompletedListener(new OnUtteranceCompletedListener() { 65c7afe28d24010fb0552a5ba7fb7b15ad507d587cPrzemyslaw Szczepaniak @Override 66c7afe28d24010fb0552a5ba7fb7b15ad507d587cPrzemyslaw Szczepaniak public void onUtteranceCompleted(String utteranceId) { 67c7afe28d24010fb0552a5ba7fb7b15ad507d587cPrzemyslaw Szczepaniak // Emulate onStart. Clients are expecting it will happen. 68c7afe28d24010fb0552a5ba7fb7b15ad507d587cPrzemyslaw Szczepaniak listener.onStart(utteranceId); 69c7afe28d24010fb0552a5ba7fb7b15ad507d587cPrzemyslaw Szczepaniak listener.onDone(utteranceId); 70c7afe28d24010fb0552a5ba7fb7b15ad507d587cPrzemyslaw Szczepaniak } 71c7afe28d24010fb0552a5ba7fb7b15ad507d587cPrzemyslaw Szczepaniak }); 72c7afe28d24010fb0552a5ba7fb7b15ad507d587cPrzemyslaw Szczepaniak } 73c7afe28d24010fb0552a5ba7fb7b15ad507d587cPrzemyslaw Szczepaniak } 74c7afe28d24010fb0552a5ba7fb7b15ad507d587cPrzemyslaw Szczepaniak} 75