Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 992ea155 authored by Niels Egberts's avatar Niels Egberts
Browse files

Fix crash with engines that don't override getVoices().

The name of the voices was not normalized in getVoices(), therefore if
you use getDefaultVoiceName, that name possibly doesn't appear in
getVoices(). The framework would then run into a NullPointerException.

This was caught by the cts tests. Also added a few more log statements.

BUG: 22115315
Change-Id: I51404ddcd1bc10dd3e1ddaac410cfa9873bf1438
parent a2e0dc4d
Loading
Loading
Loading
Loading
+13 −2
Original line number Diff line number Diff line
@@ -1486,19 +1486,28 @@ public class TextToSpeech {
                    // Get the default voice for the locale.
                    String voiceName = service.getDefaultVoiceNameFor(language, country, variant);
                    if (TextUtils.isEmpty(voiceName)) {
                        Log.w(TAG, "Couldn't find the default voice for " + language + "/" +
                                country + "/" + variant);
                        Log.w(TAG, "Couldn't find the default voice for " + language + "-" +
                                country + "-" + variant);
                        return LANG_NOT_SUPPORTED;
                    }

                    // Load it.
                    if (service.loadVoice(getCallerIdentity(), voiceName) == TextToSpeech.ERROR) {
                        Log.w(TAG, "The service claimed " + language + "-" + country + "-"
                                + variant + " was available with voice name " + voiceName
                                + " but loadVoice returned ERROR");
                        return LANG_NOT_SUPPORTED;
                    }

                    // Set the language/country/variant of the voice, so #getLanguage will return
                    // the currently set voice locale when called.
                    Voice voice = getVoice(service, voiceName);
                    if (voice == null) {
                        Log.w(TAG, "getDefaultVoiceNameFor returned " + voiceName + " for locale "
                                + language + "-" + country + "-" + variant
                                + " but getVoice returns null");
                        return LANG_NOT_SUPPORTED;
                    }
                    String voiceLanguage = "";
                    try {
                        voiceLanguage = voice.getLocale().getISO3Language();
@@ -1682,6 +1691,7 @@ public class TextToSpeech {
    private Voice getVoice(ITextToSpeechService service, String voiceName) throws RemoteException {
        List<Voice> voices = service.getVoices();
        if (voices == null) {
            Log.w(TAG, "getVoices returned null");
            return null;
        }
        for (Voice voice : voices) {
@@ -1689,6 +1699,7 @@ public class TextToSpeech {
                return voice;
            }
        }
        Log.w(TAG, "Could not find voice " + voiceName + " in voice list");
        return null;
    }

+3 −1
Original line number Diff line number Diff line
@@ -293,7 +293,9 @@ public abstract class TextToSpeechService extends Service {
            }
            Set<String> features = onGetFeaturesForLanguage(locale.getISO3Language(),
                    locale.getISO3Country(), locale.getVariant());
            voices.add(new Voice(locale.toLanguageTag(), locale, Voice.QUALITY_NORMAL,
            String voiceName = onGetDefaultVoiceNameFor(locale.getISO3Language(),
                    locale.getISO3Country(), locale.getVariant());
            voices.add(new Voice(voiceName, locale, Voice.QUALITY_NORMAL,
                    Voice.LATENCY_NORMAL, false, features));
        }
        return voices;