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