summaryrefslogtreecommitdiffstats
path: root/core/java/android/speech
diff options
context:
space:
mode:
authorPrzemyslaw Szczepaniak <pszczepaniak@google.com>2013-09-20 15:29:25 +0100
committerPrzemyslaw Szczepaniak <pszczepaniak@google.com>2013-09-25 10:01:27 +0000
commit58f16653728417100c61b5cb63298e0e3bb528dc (patch)
treec07eea8df8097f61de6fd0f5226aa2dfc40ae933 /core/java/android/speech
parent23051cac0472d29f3b28fb9820063fecba20d263 (diff)
downloadframeworks_base-58f16653728417100c61b5cb63298e0e3bb528dc.zip
frameworks_base-58f16653728417100c61b5cb63298e0e3bb528dc.tar.gz
frameworks_base-58f16653728417100c61b5cb63298e0e3bb528dc.tar.bz2
Catch MissingResourceException caused by bad locale in TTS.
Malformed locale objects will throw MissingResourceException from getISO3Country() and getISO3Language() methods. This change guard against the case where device default locale is malformed and user tries to get TTS default locale (b/10814409) and case where user tries to pass bad locale as argument to TextToSpeech.getFeatures method (b/10494193). Bug:10494193,10814409 Change-Id: Ie54d5d30bb042324da0c0d19b77c3a932c5642f7
Diffstat (limited to 'core/java/android/speech')
-rw-r--r--core/java/android/speech/tts/TextToSpeech.java10
-rw-r--r--core/java/android/speech/tts/TtsEngines.java45
2 files changed, 35 insertions, 20 deletions
diff --git a/core/java/android/speech/tts/TextToSpeech.java b/core/java/android/speech/tts/TextToSpeech.java
index b808363..2752085 100644
--- a/core/java/android/speech/tts/TextToSpeech.java
+++ b/core/java/android/speech/tts/TextToSpeech.java
@@ -993,8 +993,16 @@ public class TextToSpeech {
return runAction(new Action<Set<String>>() {
@Override
public Set<String> run(ITextToSpeechService service) throws RemoteException {
- String[] features = service.getFeaturesForLanguage(
+ String[] features = null;
+ try {
+ features = service.getFeaturesForLanguage(
locale.getISO3Language(), locale.getISO3Country(), locale.getVariant());
+ } catch(MissingResourceException e) {
+ Log.w(TAG, "Couldn't retrieve 3 letter ISO 639-2/T language and/or ISO 3166 " +
+ "country code for locale: " + locale, e);
+ return null;
+ }
+
if (features != null) {
final Set<String> featureSet = new HashSet<String>();
Collections.addAll(featureSet, features);
diff --git a/core/java/android/speech/tts/TtsEngines.java b/core/java/android/speech/tts/TtsEngines.java
index 5fbd22e..4f996cd 100644
--- a/core/java/android/speech/tts/TtsEngines.java
+++ b/core/java/android/speech/tts/TtsEngines.java
@@ -44,6 +44,7 @@ import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.Locale;
+import java.util.MissingResourceException;
/**
* Support class for querying the list of available engines
@@ -369,28 +370,34 @@ public class TtsEngines {
public String getDefaultLocale() {
final Locale locale = Locale.getDefault();
- // Note that the default locale might have an empty variant
- // or language, and we take care that the construction is
- // the same as {@link #getV1Locale} i.e no trailing delimiters
- // or spaces.
- String defaultLocale = locale.getISO3Language();
- if (TextUtils.isEmpty(defaultLocale)) {
- Log.w(TAG, "Default locale is empty.");
- return "";
- }
+ try {
+ // Note that the default locale might have an empty variant
+ // or language, and we take care that the construction is
+ // the same as {@link #getV1Locale} i.e no trailing delimiters
+ // or spaces.
+ String defaultLocale = locale.getISO3Language();
+ if (TextUtils.isEmpty(defaultLocale)) {
+ Log.w(TAG, "Default locale is empty.");
+ return "";
+ }
+
+ if (!TextUtils.isEmpty(locale.getISO3Country())) {
+ defaultLocale += LOCALE_DELIMITER + locale.getISO3Country();
+ } else {
+ // Do not allow locales of the form lang--variant with
+ // an empty country.
+ return defaultLocale;
+ }
+ if (!TextUtils.isEmpty(locale.getVariant())) {
+ defaultLocale += LOCALE_DELIMITER + locale.getVariant();
+ }
- if (!TextUtils.isEmpty(locale.getISO3Country())) {
- defaultLocale += LOCALE_DELIMITER + locale.getISO3Country();
- } else {
- // Do not allow locales of the form lang--variant with
- // an empty country.
return defaultLocale;
+ } catch (MissingResourceException e) {
+ // Default locale does not have a ISO 3166 and/or ISO 639-2/T codes. Return the
+ // default "eng-usa" (that would be the result of Locale.getDefault() == Locale.US).
+ return "eng-usa";
}
- if (!TextUtils.isEmpty(locale.getVariant())) {
- defaultLocale += LOCALE_DELIMITER + locale.getVariant();
- }
-
- return defaultLocale;
}
/**