blob: d4ffe65a9c5375d3922c735d39202e3c737b6a65 [file] [log] [blame]
Jean-Michel Trivied29a652009-06-05 18:37:29 -07001/*
2 * Copyright (C) 2009 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package com.android.settings;
18
19import static android.provider.Settings.Secure.TTS_USE_DEFAULTS;
20import static android.provider.Settings.Secure.TTS_DEFAULT_RATE;
Jean-Michel Trivi80368622009-06-09 19:29:27 -070021import static android.provider.Settings.Secure.TTS_DEFAULT_LANG;
Jean-Michel Trivi1e6a45a2009-06-22 16:03:40 -070022import static android.provider.Settings.Secure.TTS_DEFAULT_COUNTRY;
23import static android.provider.Settings.Secure.TTS_DEFAULT_VARIANT;
Jean-Michel Trivi2acc02e2009-06-25 10:03:43 -070024import static android.provider.Settings.Secure.TTS_DEFAULT_SYNTH;
Jean-Michel Trivied29a652009-06-05 18:37:29 -070025
26import android.content.ContentResolver;
Jean-Michel Trivi74e565d2009-06-18 18:44:52 -070027import android.content.Intent;
28import android.content.pm.ActivityInfo;
29import android.content.pm.PackageManager;
30import android.content.pm.ResolveInfo;
Jean-Michel Trivied29a652009-06-05 18:37:29 -070031import android.os.Bundle;
32import android.preference.ListPreference;
33import android.preference.Preference;
34import android.preference.PreferenceActivity;
35import android.preference.CheckBoxPreference;
36import android.provider.Settings;
Jean-Michel Trivi1e6a45a2009-06-22 16:03:40 -070037import android.provider.Settings.SettingNotFoundException;
Jean-Michel Trivi74e565d2009-06-18 18:44:52 -070038import android.speech.tts.TextToSpeech;
Jean-Michel Trivied29a652009-06-05 18:37:29 -070039import android.util.Log;
40
Jean-Michel Trivi74e565d2009-06-18 18:44:52 -070041import java.util.List;
Jean-Michel Trivi44fbbea2009-07-06 14:04:54 -070042import java.util.Locale;
Jean-Michel Trivi1e6a45a2009-06-22 16:03:40 -070043import java.util.StringTokenizer;
Jean-Michel Trivi74e565d2009-06-18 18:44:52 -070044
Jean-Michel Trivied29a652009-06-05 18:37:29 -070045public class TextToSpeechSettings extends PreferenceActivity implements
Jean-Michel Trivi74e565d2009-06-18 18:44:52 -070046 Preference.OnPreferenceChangeListener, Preference.OnPreferenceClickListener,
47 TextToSpeech.OnInitListener {
Jean-Michel Trivied29a652009-06-05 18:37:29 -070048
49 private static final String TAG = "TextToSpeechSettings";
Jean-Michel Trivied29a652009-06-05 18:37:29 -070050
Jean-Michel Trivi74e565d2009-06-18 18:44:52 -070051 private static final String KEY_TTS_PLAY_EXAMPLE = "tts_play_example";
Jean-Michel Trivi1e6a45a2009-06-22 16:03:40 -070052 private static final String KEY_TTS_INSTALL_DATA = "tts_install_data";
Jean-Michel Trivi74e565d2009-06-18 18:44:52 -070053 private static final String KEY_TTS_USE_DEFAULT = "toggle_use_default_tts_settings";
Jean-Michel Trivied29a652009-06-05 18:37:29 -070054 private static final String KEY_TTS_DEFAULT_RATE = "tts_default_rate";
Jean-Michel Trivi80368622009-06-09 19:29:27 -070055 private static final String KEY_TTS_DEFAULT_LANG = "tts_default_lang";
Jean-Michel Trivi1e6a45a2009-06-22 16:03:40 -070056 private static final String KEY_TTS_DEFAULT_COUNTRY = "tts_default_country";
57 private static final String KEY_TTS_DEFAULT_VARIANT = "tts_default_variant";
Jean-Michel Trivie8e23db2009-09-02 15:15:33 -070058 // TODO move default Locale values to TextToSpeech.Engine
59 private static final String DEFAULT_LANG_VAL = "eng";
60 private static final String DEFAULT_COUNTRY_VAL = "USA";
61 private static final String DEFAULT_VARIANT_VAL = "";
Jean-Michel Trivi1e6a45a2009-06-22 16:03:40 -070062
63 private static final String LOCALE_DELIMITER = "-";
Jean-Michel Trivi74e565d2009-06-18 18:44:52 -070064
Jean-Michel Trivi628431d2009-07-17 16:52:54 -070065 private static final String FALLBACK_TTS_DEFAULT_SYNTH =
Jean-Michel Trivi387dc0c2009-07-28 15:13:35 -070066 TextToSpeech.Engine.DEFAULT_SYNTH;
Jean-Michel Trivi74e565d2009-06-18 18:44:52 -070067
68 private Preference mPlayExample = null;
Jean-Michel Trivi1e6a45a2009-06-22 16:03:40 -070069 private Preference mInstallData = null;
Jean-Michel Trivied29a652009-06-05 18:37:29 -070070 private CheckBoxPreference mUseDefaultPref = null;
71 private ListPreference mDefaultRatePref = null;
Jean-Michel Trivi1e6a45a2009-06-22 16:03:40 -070072 private ListPreference mDefaultLocPref = null;
73 private String mDefaultLanguage = null;
74 private String mDefaultCountry = null;
75 private String mDefaultLocVariant = null;
Jean-Michel Trivi74e565d2009-06-18 18:44:52 -070076 private String mDefaultEng = "";
Jean-Michel Trivie8e23db2009-09-02 15:15:33 -070077 private int mDefaultRate = TextToSpeech.Engine.DEFAULT_RATE;
78
79 // Array of strings used to demonstrate TTS in the different languages.
80 private String[] mDemoStrings;
81 // Index of the current string to use for the demo.
82 private int mDemoStringIndex = 0;
Jean-Michel Trivi74e565d2009-06-18 18:44:52 -070083
84 private boolean mEnableDemo = false;
85
86 private TextToSpeech mTts = null;
87
88 /**
89 * Request code (arbitrary value) for voice data check through
90 * startActivityForResult.
91 */
92 private static final int VOICE_DATA_INTEGRITY_CHECK = 1977;
Jean-Michel Trivi2acc02e2009-06-25 10:03:43 -070093 /**
94 * Request code (arbitrary value) for voice data installation through
95 * startActivityForResult.
96 */
97 private static final int VOICE_DATA_INSTALLATION = 1980;
Jean-Michel Trivi74e565d2009-06-18 18:44:52 -070098
Jean-Michel Trivied29a652009-06-05 18:37:29 -070099 @Override
100 protected void onCreate(Bundle savedInstanceState) {
101 super.onCreate(savedInstanceState);
102
103 addPreferencesFromResource(R.xml.tts_settings);
Jean-Michel Trivi74e565d2009-06-18 18:44:52 -0700104
Jean-Michel Trivie8e23db2009-09-02 15:15:33 -0700105 mDemoStrings = getResources().getStringArray(R.array.tts_demo_strings);
106
Jean-Michel Trivi6dde8962009-08-11 09:06:58 -0700107 setVolumeControlStream(TextToSpeech.Engine.DEFAULT_STREAM);
108
Jean-Michel Trivi2acc02e2009-06-25 10:03:43 -0700109 mEnableDemo = false;
Jean-Michel Trivi1e6a45a2009-06-22 16:03:40 -0700110 initClickers();
Jean-Michel Trivied29a652009-06-05 18:37:29 -0700111 initDefaultSettings();
Jean-Michel Trivi74e565d2009-06-18 18:44:52 -0700112 }
Jean-Michel Trivi44fbbea2009-07-06 14:04:54 -0700113
114
Jean-Michel Trivi74e565d2009-06-18 18:44:52 -0700115 @Override
Jean-Michel Trivi1e6a45a2009-06-22 16:03:40 -0700116 protected void onStart() {
117 super.onStart();
Jean-Michel Trivi74e565d2009-06-18 18:44:52 -0700118 // whenever we return to this screen, we don't know the state of the
119 // system, so we have to recheck that we can play the demo, or it must be disabled.
Jean-Michel Trivi44fbbea2009-07-06 14:04:54 -0700120 // TODO make the TTS service listen to "changes in the system", i.e. sd card un/mount
Jean-Michel Trivi1e6a45a2009-06-22 16:03:40 -0700121 initClickers();
122 updateWidgetState();
123 checkVoiceData();
Jean-Michel Trivi74e565d2009-06-18 18:44:52 -0700124 }
125
126
127 @Override
128 protected void onDestroy() {
129 super.onDestroy();
130 if (mTts != null) {
131 mTts.shutdown();
132 }
133 }
134
135
Jean-Michel Trivi1e6a45a2009-06-22 16:03:40 -0700136 private void initClickers() {
Jean-Michel Trivi74e565d2009-06-18 18:44:52 -0700137 mPlayExample = findPreference(KEY_TTS_PLAY_EXAMPLE);
Jean-Michel Trivi74e565d2009-06-18 18:44:52 -0700138 mPlayExample.setOnPreferenceClickListener(this);
Jean-Michel Trivi1e6a45a2009-06-22 16:03:40 -0700139
140 mInstallData = findPreference(KEY_TTS_INSTALL_DATA);
141 mInstallData.setOnPreferenceClickListener(this);
Jean-Michel Trivied29a652009-06-05 18:37:29 -0700142 }
143
144
145 private void initDefaultSettings() {
146 ContentResolver resolver = getContentResolver();
Jean-Michel Trivi1e6a45a2009-06-22 16:03:40 -0700147
148 // Find the default TTS values in the settings, initialize and store the
149 // settings if they are not found.
Jean-Michel Trivied29a652009-06-05 18:37:29 -0700150
151 // "Use Defaults"
Jean-Michel Trivie8e23db2009-09-02 15:15:33 -0700152 int useDefault = 0;
Jean-Michel Trivi1e6a45a2009-06-22 16:03:40 -0700153 mUseDefaultPref = (CheckBoxPreference) findPreference(KEY_TTS_USE_DEFAULT);
154 try {
Jean-Michel Trivie8e23db2009-09-02 15:15:33 -0700155 useDefault = Settings.Secure.getInt(resolver, TTS_USE_DEFAULTS);
Jean-Michel Trivi1e6a45a2009-06-22 16:03:40 -0700156 } catch (SettingNotFoundException e) {
157 // "use default" setting not found, initialize it
Jean-Michel Trivie8e23db2009-09-02 15:15:33 -0700158 useDefault = TextToSpeech.Engine.USE_DEFAULTS;
159 Settings.Secure.putInt(resolver, TTS_USE_DEFAULTS, useDefault);
Jean-Michel Trivi1e6a45a2009-06-22 16:03:40 -0700160 }
Jean-Michel Trivie8e23db2009-09-02 15:15:33 -0700161 mUseDefaultPref.setChecked(useDefault == 1);
Jean-Michel Trivied29a652009-06-05 18:37:29 -0700162 mUseDefaultPref.setOnPreferenceChangeListener(this);
163
Jean-Michel Trivi74e565d2009-06-18 18:44:52 -0700164 // Default engine
Jean-Michel Trivi2acc02e2009-06-25 10:03:43 -0700165 String engine = Settings.Secure.getString(resolver, TTS_DEFAULT_SYNTH);
166 if (engine == null) {
167 // TODO move FALLBACK_TTS_DEFAULT_SYNTH to TextToSpeech
168 engine = FALLBACK_TTS_DEFAULT_SYNTH;
169 Settings.Secure.putString(resolver, TTS_DEFAULT_SYNTH, engine);
170 }
171 mDefaultEng = engine;
Jean-Michel Trivi74e565d2009-06-18 18:44:52 -0700172
Jean-Michel Trivied29a652009-06-05 18:37:29 -0700173 // Default rate
Jean-Michel Trivi1e6a45a2009-06-22 16:03:40 -0700174 mDefaultRatePref = (ListPreference) findPreference(KEY_TTS_DEFAULT_RATE);
175 try {
Jean-Michel Trivie8e23db2009-09-02 15:15:33 -0700176 mDefaultRate = Settings.Secure.getInt(resolver, TTS_DEFAULT_RATE);
Jean-Michel Trivi1e6a45a2009-06-22 16:03:40 -0700177 } catch (SettingNotFoundException e) {
178 // default rate setting not found, initialize it
Jean-Michel Trivie8e23db2009-09-02 15:15:33 -0700179 mDefaultRate = TextToSpeech.Engine.DEFAULT_RATE;
180 Settings.Secure.putInt(resolver, TTS_DEFAULT_RATE, mDefaultRate);
Jean-Michel Trivi1e6a45a2009-06-22 16:03:40 -0700181 }
Jean-Michel Trivie8e23db2009-09-02 15:15:33 -0700182 mDefaultRatePref.setValue(String.valueOf(mDefaultRate));
Jean-Michel Trivied29a652009-06-05 18:37:29 -0700183 mDefaultRatePref.setOnPreferenceChangeListener(this);
184
Jean-Michel Trivi1e6a45a2009-06-22 16:03:40 -0700185 // Default language / country / variant : these three values map to a single ListPref
186 // representing the matching Locale
Jean-Michel Trivi1e6a45a2009-06-22 16:03:40 -0700187 mDefaultLocPref = (ListPreference) findPreference(KEY_TTS_DEFAULT_LANG);
Jean-Michel Trivie8e23db2009-09-02 15:15:33 -0700188 initDefaultLang();
Jean-Michel Trivi1e6a45a2009-06-22 16:03:40 -0700189 mDefaultLocPref.setOnPreferenceChangeListener(this);
Jean-Michel Trivied29a652009-06-05 18:37:29 -0700190 }
191
192
Jean-Michel Trivi2acc02e2009-06-25 10:03:43 -0700193 /**
194 * Ask the current default engine to launch the matching CHECK_TTS_DATA activity
195 * to check the required TTS files are properly installed.
196 */
Jean-Michel Trivi74e565d2009-06-18 18:44:52 -0700197 private void checkVoiceData() {
198 PackageManager pm = getPackageManager();
199 Intent intent = new Intent();
Jean-Michel Trivi387dc0c2009-07-28 15:13:35 -0700200 intent.setAction(TextToSpeech.Engine.ACTION_CHECK_TTS_DATA);
Jean-Michel Trivi74e565d2009-06-18 18:44:52 -0700201 List<ResolveInfo> resolveInfos = pm.queryIntentActivities(intent, 0);
202 // query only the package that matches that of the default engine
203 for (int i = 0; i < resolveInfos.size(); i++) {
204 ActivityInfo currentActivityInfo = resolveInfos.get(i).activityInfo;
205 if (mDefaultEng.equals(currentActivityInfo.packageName)) {
206 intent.setClassName(mDefaultEng, currentActivityInfo.name);
207 this.startActivityForResult(intent, VOICE_DATA_INTEGRITY_CHECK);
208 }
209 }
210 }
211
212
213 /**
Jean-Michel Trivi2acc02e2009-06-25 10:03:43 -0700214 * Ask the current default engine to launch the matching INSTALL_TTS_DATA activity
215 * so the required TTS files are properly installed.
216 */
217 private void installVoiceData() {
218 PackageManager pm = getPackageManager();
219 Intent intent = new Intent();
Jean-Michel Trivi387dc0c2009-07-28 15:13:35 -0700220 intent.setAction(TextToSpeech.Engine.ACTION_INSTALL_TTS_DATA);
Jean-Michel Trivi2acc02e2009-06-25 10:03:43 -0700221 List<ResolveInfo> resolveInfos = pm.queryIntentActivities(intent, 0);
222 // query only the package that matches that of the default engine
223 for (int i = 0; i < resolveInfos.size(); i++) {
224 ActivityInfo currentActivityInfo = resolveInfos.get(i).activityInfo;
225 if (mDefaultEng.equals(currentActivityInfo.packageName)) {
226 intent.setClassName(mDefaultEng, currentActivityInfo.name);
227 this.startActivityForResult(intent, VOICE_DATA_INSTALLATION);
228 }
229 }
230 }
231
232
233 /**
Jean-Michel Trivi74e565d2009-06-18 18:44:52 -0700234 * Called when the TTS engine is initialized.
235 */
236 public void onInit(int status) {
Jean-Michel Trivi387dc0c2009-07-28 15:13:35 -0700237 if (status == TextToSpeech.SUCCESS) {
Jean-Michel Trivi74e565d2009-06-18 18:44:52 -0700238 Log.v(TAG, "TTS engine for settings screen initialized.");
239 mEnableDemo = true;
Jean-Michel Trivie8e23db2009-09-02 15:15:33 -0700240 mTts.setLanguage(new Locale(mDefaultLanguage, mDefaultCountry));
241 mTts.setSpeechRate((float)(mDefaultRate/100.0f));
Jean-Michel Trivi74e565d2009-06-18 18:44:52 -0700242 } else {
243 Log.v(TAG, "TTS engine for settings screen failed to initialize successfully.");
244 mEnableDemo = false;
245 }
Jean-Michel Trivi1e6a45a2009-06-22 16:03:40 -0700246 updateWidgetState();
Jean-Michel Trivi74e565d2009-06-18 18:44:52 -0700247 }
248
249
250 /**
251 * Called when voice data integrity check returns
252 */
253 protected void onActivityResult(int requestCode, int resultCode, Intent data) {
254 if (requestCode == VOICE_DATA_INTEGRITY_CHECK) {
255 if (resultCode == TextToSpeech.Engine.CHECK_VOICE_DATA_PASS) {
256 Log.v(TAG, "Voice data check passed");
257 if (mTts == null) {
258 mTts = new TextToSpeech(this, this);
259 }
260 } else {
261 Log.v(TAG, "Voice data check failed");
Jean-Michel Trivi2acc02e2009-06-25 10:03:43 -0700262 mEnableDemo = false;
263 updateWidgetState();
Jean-Michel Trivi74e565d2009-06-18 18:44:52 -0700264 }
265 }
266 }
267
268
Jean-Michel Trivied29a652009-06-05 18:37:29 -0700269 public boolean onPreferenceChange(Preference preference, Object objValue) {
270 if (KEY_TTS_USE_DEFAULT.equals(preference.getKey())) {
271 // "Use Defaults"
272 int value = (Boolean)objValue ? 1 : 0;
Jean-Michel Trivi80368622009-06-09 19:29:27 -0700273 Settings.Secure.putInt(getContentResolver(), TTS_USE_DEFAULTS,
Jean-Michel Trivied29a652009-06-05 18:37:29 -0700274 value);
275 Log.i(TAG, "TTS use default settings is "+objValue.toString());
276 } else if (KEY_TTS_DEFAULT_RATE.equals(preference.getKey())) {
277 // Default rate
Jean-Michel Trivie8e23db2009-09-02 15:15:33 -0700278 mDefaultRate = Integer.parseInt((String) objValue);
Jean-Michel Trivied29a652009-06-05 18:37:29 -0700279 try {
Jean-Michel Trivi44fbbea2009-07-06 14:04:54 -0700280 Settings.Secure.putInt(getContentResolver(),
Jean-Michel Trivie8e23db2009-09-02 15:15:33 -0700281 TTS_DEFAULT_RATE, mDefaultRate);
Jean-Michel Trivi1e6a45a2009-06-22 16:03:40 -0700282 if (mTts != null) {
Jean-Michel Trivie8e23db2009-09-02 15:15:33 -0700283 mTts.setSpeechRate((float)(mDefaultRate/100.0f));
Jean-Michel Trivi1e6a45a2009-06-22 16:03:40 -0700284 }
Jean-Michel Trivie8e23db2009-09-02 15:15:33 -0700285 Log.i(TAG, "TTS default rate is " + mDefaultRate);
Jean-Michel Trivied29a652009-06-05 18:37:29 -0700286 } catch (NumberFormatException e) {
287 Log.e(TAG, "could not persist default TTS rate setting", e);
288 }
Jean-Michel Trivi74e565d2009-06-18 18:44:52 -0700289 } else if (KEY_TTS_DEFAULT_LANG.equals(preference.getKey())) {
Jean-Michel Trivi1e6a45a2009-06-22 16:03:40 -0700290 // Default locale
291 ContentResolver resolver = getContentResolver();
292 parseLocaleInfo((String) objValue);
293 Settings.Secure.putString(resolver, TTS_DEFAULT_LANG, mDefaultLanguage);
294 Settings.Secure.putString(resolver, TTS_DEFAULT_COUNTRY, mDefaultCountry);
295 Settings.Secure.putString(resolver, TTS_DEFAULT_VARIANT, mDefaultLocVariant);
296 Log.v(TAG, "TTS default lang/country/variant set to "
297 + mDefaultLanguage + "/" + mDefaultCountry + "/" + mDefaultLocVariant);
Jean-Michel Trivi628431d2009-07-17 16:52:54 -0700298 if (mTts != null) {
299 mTts.setLanguage(new Locale(mDefaultLanguage, mDefaultCountry));
300 }
Jean-Michel Trivie8e23db2009-09-02 15:15:33 -0700301 int newIndex = mDefaultLocPref.findIndexOfValue((String)objValue);
302 Log.v("Settings", " selected is " + newIndex);
303 mDemoStringIndex = newIndex > -1 ? newIndex : 0;
Jean-Michel Trivied29a652009-06-05 18:37:29 -0700304 }
Jean-Michel Trivi44fbbea2009-07-06 14:04:54 -0700305
Jean-Michel Trivied29a652009-06-05 18:37:29 -0700306 return true;
307 }
Jean-Michel Trivi44fbbea2009-07-06 14:04:54 -0700308
Jean-Michel Trivi74e565d2009-06-18 18:44:52 -0700309
Jean-Michel Trivi1e6a45a2009-06-22 16:03:40 -0700310 /**
311 * Called when mPlayExample or mInstallData is clicked
312 */
Jean-Michel Trivi74e565d2009-06-18 18:44:52 -0700313 public boolean onPreferenceClick(Preference preference) {
314 if (preference == mPlayExample) {
Jean-Michel Trivi1e6a45a2009-06-22 16:03:40 -0700315 // Play example
Jean-Michel Trivi74e565d2009-06-18 18:44:52 -0700316 if (mTts != null) {
Jean-Michel Trivie8e23db2009-09-02 15:15:33 -0700317 mTts.speak(mDemoStrings[mDemoStringIndex], TextToSpeech.QUEUE_FLUSH, null);
Jean-Michel Trivi74e565d2009-06-18 18:44:52 -0700318 }
319 return true;
320 }
Jean-Michel Trivi1e6a45a2009-06-22 16:03:40 -0700321 if (preference == mInstallData) {
Jean-Michel Trivi2acc02e2009-06-25 10:03:43 -0700322 installVoiceData();
323 // quit this activity so it needs to be restarted after installation of the voice data
324 finish();
Jean-Michel Trivi1e6a45a2009-06-22 16:03:40 -0700325 return true;
326 }
Jean-Michel Trivi74e565d2009-06-18 18:44:52 -0700327 return false;
328 }
329
Jean-Michel Trivi1e6a45a2009-06-22 16:03:40 -0700330
331 private void updateWidgetState() {
332 mPlayExample.setEnabled(mEnableDemo);
333 mUseDefaultPref.setEnabled(mEnableDemo);
334 mDefaultRatePref.setEnabled(mEnableDemo);
Jean-Michel Trivi1e6a45a2009-06-22 16:03:40 -0700335 mDefaultLocPref.setEnabled(mEnableDemo);
336
337 mInstallData.setEnabled(!mEnableDemo);
338 }
339
340
341 private void parseLocaleInfo(String locale) {
342 StringTokenizer tokenizer = new StringTokenizer(locale, LOCALE_DELIMITER);
343 mDefaultLanguage = "";
344 mDefaultCountry = "";
345 mDefaultLocVariant = "";
346 if (tokenizer.hasMoreTokens()) {
347 mDefaultLanguage = tokenizer.nextToken().trim();
348 }
349 if (tokenizer.hasMoreTokens()) {
350 mDefaultCountry = tokenizer.nextToken().trim();
351 }
352 if (tokenizer.hasMoreTokens()) {
353 mDefaultLocVariant = tokenizer.nextToken().trim();
354 }
355 }
356
357
Jean-Michel Trivie8e23db2009-09-02 15:15:33 -0700358 /**
359 * Initialize the default language in the UI and in the preferences.
360 * After this method has been invoked, the default language is a supported Locale.
361 */
362 private void initDefaultLang() {
363 // if there isn't already a default language preference
364 if (!hasLangPref()) {
365 // if the current Locale is supported
366 if (isCurrentLocSupported()) {
367 // then use the current Locale as the default language
368 useCurrentLocAsDefault();
369 } else {
370 // otherwise use a default supported Locale as the default language
371 useSupportedLocAsDefault();
372 }
Jean-Michel Trivi44fbbea2009-07-06 14:04:54 -0700373 }
374
Jean-Michel Trivie8e23db2009-09-02 15:15:33 -0700375 // Update the language preference list with the default language and the matching
376 // demo string (at this stage there is a default language pref)
377 ContentResolver resolver = getContentResolver();
378 mDefaultLanguage = Settings.Secure.getString(resolver, TTS_DEFAULT_LANG);
379 mDefaultCountry = Settings.Secure.getString(resolver, KEY_TTS_DEFAULT_COUNTRY);
380 mDefaultLocVariant = Settings.Secure.getString(resolver, KEY_TTS_DEFAULT_VARIANT);
Jean-Michel Trivi44fbbea2009-07-06 14:04:54 -0700381
Jean-Michel Trivie8e23db2009-09-02 15:15:33 -0700382 // update the demo string
383 mDemoStringIndex = mDefaultLocPref.findIndexOfValue(mDefaultLanguage + LOCALE_DELIMITER
384 + mDefaultCountry);
385 mDefaultLocPref.setValueIndex(mDemoStringIndex);
386 }
387
388 /**
389 * (helper function for initDefaultLang() )
390 * Returns whether there is a default language in the TTS settings.
391 */
392 private boolean hasLangPref() {
393 String language = Settings.Secure.getString(getContentResolver(), TTS_DEFAULT_LANG);
394 return (language != null);
395 }
396
397 /**
398 * (helper function for initDefaultLang() )
399 * Returns whether the current Locale is supported by this Settings screen
400 */
401 private boolean isCurrentLocSupported() {
402 String currentLocID = Locale.getDefault().getISO3Language() + LOCALE_DELIMITER
403 + Locale.getDefault().getISO3Country();
404 return (mDefaultLocPref.findIndexOfValue(currentLocID) > -1);
405 }
406
407 /**
408 * (helper function for initDefaultLang() )
409 * Sets the default language in TTS settings to be the current Locale.
410 * This should only be used after checking that the current Locale is supported.
411 */
412 private void useCurrentLocAsDefault() {
413 Locale currentLocale = Locale.getDefault();
414 ContentResolver resolver = getContentResolver();
415 Settings.Secure.putString(resolver, TTS_DEFAULT_LANG, currentLocale.getISO3Language());
416 Settings.Secure.putString(resolver, TTS_DEFAULT_COUNTRY, currentLocale.getISO3Country());
417 Settings.Secure.putString(resolver, TTS_DEFAULT_VARIANT, currentLocale.getVariant());
418 }
419
420 /**
421 * (helper function for initDefaultLang() )
422 * Sets the default language in TTS settings to be one known to be supported
423 */
424 private void useSupportedLocAsDefault() {
425 ContentResolver resolver = getContentResolver();
426 Settings.Secure.putString(resolver, TTS_DEFAULT_LANG, DEFAULT_LANG_VAL);
427 Settings.Secure.putString(resolver, TTS_DEFAULT_COUNTRY, DEFAULT_COUNTRY_VAL);
428 Settings.Secure.putString(resolver, TTS_DEFAULT_VARIANT, DEFAULT_VARIANT_VAL);
Jean-Michel Trivi44fbbea2009-07-06 14:04:54 -0700429 }
430
Jean-Michel Trivied29a652009-06-05 18:37:29 -0700431}