summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--res/values/strings.xml15
-rw-r--r--res/xml/tts_settings.xml5
-rw-r--r--src/com/android/settings/tts/TextToSpeechSettings.java138
3 files changed, 114 insertions, 44 deletions
diff --git a/res/values/strings.xml b/res/values/strings.xml
index b7973408e..49a888bea 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -3560,6 +3560,21 @@
<!-- Warning message about required internet conectivity for TTS synthesis, displayed as a dialog
message when the user selects to play an example for network only locale and there's no internet connectivity. -->
<string name="tts_engine_network_required">This language requires a working network connection for text-to-speech output.</string>
+ <!-- Text spoken by the TTS engine as an example if the engine doesn't provide sample text [CHAR LIMIT=100] -->
+ <string name="tts_default_sample_string">This is an example of speech synthesis</string>
+ <!-- On main TTS Settings screen, title of a field explaining current TTS engine status for
+ current default language [CHAR LIMIT=50] -->
+ <string name="tts_status_title">Default language status</string>
+ <!-- On main TTS Settings screen, current TTS engine status for the current default language,
+ selected language is fully supported by the engine [CHAR LIMIT=150]-->
+ <string name="tts_status_ok"><xliff:g id="locale" example="English (United States)">%1$s</xliff:g> is fully supported</string>
+ <!-- On main TTS Settings screen, current TTS engine status for the current default language,
+ selected language is supported by the engine only if there's a working network connection
+ [CHAR LIMIT=150]-->
+ <string name="tts_status_requires_network"><xliff:g id="locale" example="English (United States)">%1$s</xliff:g> requires network connection</string>
+ <!-- On main TTS Settings screen, current TTS engine status for the current default language,
+ selected language is not supported by the engine [CHAR LIMIT=150]-->
+ <string name="tts_status_not_supported"><xliff:g id="locale" example="English (United States)">%1$s</xliff:g> is not supported</string>
<!-- On main TTS Settings screen, text for divider under which all TTS engines are listed -->
<string name="tts_engines_section">Engines</string>
<!-- On main TTS Settings screen, text preceded by the TTS engine name, clicking this button will launch the engine settings -->
diff --git a/res/xml/tts_settings.xml b/res/xml/tts_settings.xml
index 2b145d188..ab132df9e 100644
--- a/res/xml/tts_settings.xml
+++ b/res/xml/tts_settings.xml
@@ -37,4 +37,9 @@
android:persistent="false"
android:title="@string/tts_play_example_title"
android:summary="@string/tts_play_example_summary" />
+
+ <Preference android:key="tts_status"
+ style="?android:attr/preferenceInformationStyle"
+ android:persistent="false"
+ android:title="@string/tts_status_title"/>
</PreferenceScreen>
diff --git a/src/com/android/settings/tts/TextToSpeechSettings.java b/src/com/android/settings/tts/TextToSpeechSettings.java
index 8f83bbc77..10ac57597 100644
--- a/src/com/android/settings/tts/TextToSpeechSettings.java
+++ b/src/com/android/settings/tts/TextToSpeechSettings.java
@@ -60,6 +60,9 @@ public class TextToSpeechSettings extends SettingsPreferenceFragment implements
/** Preference key for the TTS rate selection dialog. */
private static final String KEY_DEFAULT_RATE = "tts_default_rate";
+ /** Preference key for the TTS status field. */
+ private static final String KEY_STATUS = "tts_status";
+
/**
* Preference key for the engine selection preference.
*/
@@ -75,6 +78,7 @@ public class TextToSpeechSettings extends SettingsPreferenceFragment implements
private PreferenceCategory mEnginePreferenceCategory;
private ListPreference mDefaultRatePref;
private Preference mPlayExample;
+ private Preference mEngineStatus;
private int mDefaultRate = TextToSpeech.Engine.DEFAULT_RATE;
@@ -98,6 +102,9 @@ public class TextToSpeechSettings extends SettingsPreferenceFragment implements
private TextToSpeech mTts = null;
private TtsEngines mEnginesHelper = null;
+ private String mSampleText = "";
+ private Locale mCurrentDefaultLocale;
+
/**
* The initialization listener used when we are initalizing the settings
* screen for the first time (as opposed to when a user changes his choice
@@ -136,6 +143,8 @@ public class TextToSpeechSettings extends SettingsPreferenceFragment implements
KEY_ENGINE_PREFERENCE_SECTION);
mDefaultRatePref = (ListPreference) findPreference(KEY_DEFAULT_RATE);
+ mEngineStatus = findPreference(KEY_STATUS);
+
mTts = new TextToSpeech(getActivity().getApplicationContext(), mInitListener);
mEnginesHelper = new TtsEngines(getActivity().getApplicationContext());
@@ -143,6 +152,20 @@ public class TextToSpeechSettings extends SettingsPreferenceFragment implements
initSettings();
}
+ @Override
+ public void onResume() {
+ super.onResume();
+
+ if (mTts == null || mCurrentDefaultLocale == null) {
+ return;
+ }
+ Locale ttsDefaultLocale = mTts.getDefaultLanguage();
+ if (mCurrentDefaultLocale != null && !mCurrentDefaultLocale.equals(ttsDefaultLocale)) {
+ updateWidgetState(false);
+ checkDefaultLocale();
+ }
+ }
+
private void setTtsUtteranceProgressListener() {
if (mTts == null) {
return;
@@ -206,6 +229,46 @@ public class TextToSpeechSettings extends SettingsPreferenceFragment implements
}
/**
+ * Called when the TTS engine is initialized.
+ */
+ public void onInitEngine(int status) {
+ if (status == TextToSpeech.SUCCESS) {
+ if (DBG) Log.d(TAG, "TTS engine for settings screen initialized.");
+ checkDefaultLocale();
+ } else {
+ if (DBG) Log.d(TAG, "TTS engine for settings screen failed to initialize successfully.");
+ updateWidgetState(false);
+ }
+ }
+
+ private void checkDefaultLocale() {
+ Locale defaultLocale = mTts.getDefaultLanguage();
+ if (defaultLocale == null) {
+ Log.e(TAG, "Failed to get default language from engine " + mCurrentEngine);
+ updateWidgetState(false);
+ updateEngineStatus(R.string.tts_status_not_supported);
+ return;
+ }
+
+ mCurrentDefaultLocale = defaultLocale;
+
+ int defaultAvailable = mTts.setLanguage(defaultLocale);
+ if (defaultAvailable == TextToSpeech.LANG_NOT_SUPPORTED) {
+ if (DBG) Log.d(TAG, "Default locale for this TTS engine is not supported.");
+ updateWidgetState(false);
+ updateEngineStatus(R.string.tts_status_not_supported);
+ } else {
+ if (isNetworkRequiredForSynthesis()) {
+ updateEngineStatus(R.string.tts_status_requires_network);
+ } else {
+ updateEngineStatus(R.string.tts_status_ok);
+ }
+ getSampleText();
+ }
+ }
+
+
+ /**
* Ask the current default engine to return a string of sample text to be
* spoken to the user.
*/
@@ -214,23 +277,15 @@ public class TextToSpeechSettings extends SettingsPreferenceFragment implements
if (TextUtils.isEmpty(currentEngine)) currentEngine = mTts.getDefaultEngine();
-
- Locale defaultLocale = mTts.getDefaultLanguage();
- if (defaultLocale == null) {
- Log.e(TAG, "Failed to get default language from engine " + currentEngine);
- return;
- }
- mTts.setLanguage(defaultLocale);
-
// TODO: This is currently a hidden private API. The intent extras
// and the intent action should be made public if we intend to make this
// a public API. We fall back to using a canned set of strings if this
// doesn't work.
Intent intent = new Intent(TextToSpeech.Engine.ACTION_GET_SAMPLE_TEXT);
- intent.putExtra("language", defaultLocale.getLanguage());
- intent.putExtra("country", defaultLocale.getCountry());
- intent.putExtra("variant", defaultLocale.getVariant());
+ intent.putExtra("language", mCurrentDefaultLocale.getLanguage());
+ intent.putExtra("country", mCurrentDefaultLocale.getCountry());
+ intent.putExtra("variant", mCurrentDefaultLocale.getVariant());
intent.setPackage(currentEngine);
try {
@@ -242,19 +297,6 @@ public class TextToSpeechSettings extends SettingsPreferenceFragment implements
}
/**
- * Called when the TTS engine is initialized.
- */
- public void onInitEngine(int status) {
- if (status == TextToSpeech.SUCCESS) {
- updateWidgetState(true);
- if (DBG) Log.d(TAG, "TTS engine for settings screen initialized.");
- } else {
- if (DBG) Log.d(TAG, "TTS engine for settings screen failed to initialize successfully.");
- updateWidgetState(false);
- }
- }
-
- /**
* Called when voice data integrity check returns
*/
@Override
@@ -280,11 +322,11 @@ public class TextToSpeechSettings extends SettingsPreferenceFragment implements
}
}
}
- return null;
+ return getString(R.string.tts_default_sample_string);
}
private boolean isNetworkRequiredForSynthesis() {
- Set<String> features = mTts.getFeatures(mTts.getLanguage());
+ Set<String> features = mTts.getFeatures(mCurrentDefaultLocale);
return features.contains(TextToSpeech.Engine.KEY_FEATURE_NETWORK_SYNTHESIS) &&
!features.contains(TextToSpeech.Engine.KEY_FEATURE_EMBEDDED_SYNTHESIS);
}
@@ -301,24 +343,25 @@ public class TextToSpeechSettings extends SettingsPreferenceFragment implements
if (DBG) Log.d(TAG, "Using default sample text :" + sample);
}
- if (sample != null && mTts != null) {
- // The engine is guaranteed to have been initialized here
- // because this preference is not enabled otherwise.
+ mSampleText = sample;
+ if (mSampleText != null) {
+ updateWidgetState(true);
+ } else {
+ Log.e(TAG, "Did not have a sample string for the requested language. Using default");
+ }
+ }
- final boolean networkRequired = isNetworkRequiredForSynthesis();
- if (!networkRequired || networkRequired &&
- (mTts.isLanguageAvailable(mTts.getLanguage()) >= TextToSpeech.LANG_AVAILABLE)) {
- HashMap<String, String> params = new HashMap<String, String>();
- params.put(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID, "Sample");
+ private void speakSampleText() {
+ final boolean networkRequired = isNetworkRequiredForSynthesis();
+ if (!networkRequired || networkRequired &&
+ (mTts.isLanguageAvailable(mCurrentDefaultLocale) >= TextToSpeech.LANG_AVAILABLE)) {
+ HashMap<String, String> params = new HashMap<String, String>();
+ params.put(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID, "Sample");
- mTts.speak(sample, TextToSpeech.QUEUE_FLUSH, params);
- } else {
- Log.w(TAG, "Network required for sample synthesis for requested language");
- displayNetworkAlert();
- }
+ mTts.speak(mSampleText, TextToSpeech.QUEUE_FLUSH, params);
} else {
- // TODO: Display an error here to the user.
- Log.e(TAG, "Did not have a sample string for the requested language");
+ Log.w(TAG, "Network required for sample synthesis for requested language");
+ displayNetworkAlert();
}
}
@@ -349,7 +392,7 @@ public class TextToSpeechSettings extends SettingsPreferenceFragment implements
if (preference == mPlayExample) {
// Get the sample text from the TTS engine; onActivityResult will do
// the actual speaking
- getSampleText();
+ speakSampleText();
return true;
}
@@ -359,6 +402,15 @@ public class TextToSpeechSettings extends SettingsPreferenceFragment implements
private void updateWidgetState(boolean enable) {
mPlayExample.setEnabled(enable);
mDefaultRatePref.setEnabled(enable);
+ mEngineStatus.setEnabled(enable);
+ }
+
+ private void updateEngineStatus(int resourceId) {
+ Locale locale = mCurrentDefaultLocale;
+ if (locale == null) {
+ locale = Locale.getDefault();
+ }
+ mEngineStatus.setSummary(getString(resourceId, locale.getDisplayName()));
}
private void displayNetworkAlert() {
@@ -474,8 +526,6 @@ public class TextToSpeechSettings extends SettingsPreferenceFragment implements
}
}
}
-
- updateWidgetState(true);
}
@Override