diff options
Diffstat (limited to 'src/com/android/settings/tts/TtsEngineSettingsFragment.java')
-rw-r--r-- | src/com/android/settings/tts/TtsEngineSettingsFragment.java | 200 |
1 files changed, 200 insertions, 0 deletions
diff --git a/src/com/android/settings/tts/TtsEngineSettingsFragment.java b/src/com/android/settings/tts/TtsEngineSettingsFragment.java new file mode 100644 index 0000000..d78f80d --- /dev/null +++ b/src/com/android/settings/tts/TtsEngineSettingsFragment.java @@ -0,0 +1,200 @@ +/* + * Copyright (C) 2011 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.settings.tts; + +import com.android.settings.R; +import com.android.settings.SettingsPreferenceFragment; + +import android.content.ActivityNotFoundException; +import android.content.Intent; +import android.os.Bundle; +import android.preference.ListPreference; +import android.preference.Preference; +import android.preference.Preference.OnPreferenceChangeListener; +import android.preference.Preference.OnPreferenceClickListener; +import android.preference.PreferenceScreen; +import android.speech.tts.TextToSpeech; +import android.speech.tts.TtsEngines; +import android.text.TextUtils; +import android.util.Log; + +import java.util.ArrayList; +import java.util.Locale; + + +public class TtsEngineSettingsFragment extends SettingsPreferenceFragment implements + OnPreferenceClickListener, OnPreferenceChangeListener { + private static final String TAG = "TtsEngineSettings"; + private static final boolean DBG = false; + + private static final String KEY_ENGINE_LOCALE = "tts_default_lang"; + private static final String KEY_ENGINE_SETTINGS = "tts_engine_settings"; + private static final String KEY_INSTALL_DATA = "tts_install_data"; + + private TtsEngines mEnginesHelper; + private ListPreference mLocalePreference; + private Preference mEngineSettingsPreference; + private Preference mInstallVoicesPreference; + private Intent mEngineSettingsIntent; + + public TtsEngineSettingsFragment() { + super(); + } + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + addPreferencesFromResource(R.xml.tts_engine_settings); + mEnginesHelper = new TtsEngines(getActivity()); + + final PreferenceScreen root = getPreferenceScreen(); + mLocalePreference = (ListPreference) root.findPreference(KEY_ENGINE_LOCALE); + mLocalePreference.setOnPreferenceChangeListener(this); + mEngineSettingsPreference = root.findPreference(KEY_ENGINE_SETTINGS); + mEngineSettingsPreference.setOnPreferenceClickListener(this); + mInstallVoicesPreference = root.findPreference(KEY_INSTALL_DATA); + mInstallVoicesPreference.setOnPreferenceClickListener(this); + + root.setTitle(getEngineLabel()); + root.setKey(getEngineName()); + mEngineSettingsPreference.setTitle(getResources().getString( + R.string.tts_engine_settings_title, getEngineLabel())); + + mEngineSettingsIntent = mEnginesHelper.getSettingsIntent(getEngineName()); + if (mEngineSettingsIntent == null) { + mEngineSettingsPreference.setEnabled(false); + } + mInstallVoicesPreference.setEnabled(false); + + updateVoiceDetails(); + } + + private void updateVoiceDetails() { + final Intent voiceDataDetails = getArguments().getParcelable( + TtsEnginePreference.FRAGMENT_ARGS_VOICES); + if (DBG) Log.d(TAG, "Parsing voice data details, data: " + voiceDataDetails.toUri(0)); + ArrayList<String> available = voiceDataDetails.getStringArrayListExtra( + TextToSpeech.Engine.EXTRA_AVAILABLE_VOICES); + ArrayList<String> unavailable = voiceDataDetails.getStringArrayListExtra( + TextToSpeech.Engine.EXTRA_UNAVAILABLE_VOICES); + + if (available == null || unavailable == null){ + Log.e(TAG, "TTS data check failed (available == null)."); + return; + } + + if (unavailable.size() > 0) { + mInstallVoicesPreference.setEnabled(true); + } + + if (available.size() > 0) { + updateDefaultLocalePref(available); + } else { + final CharSequence[] empty = new CharSequence[0]; + mLocalePreference.setEntries(empty); + mLocalePreference.setEntryValues(empty); + } + } + + private void updateDefaultLocalePref(ArrayList<String> availableLangs) { + String currentLocale = mEnginesHelper.getLocalePrefForEngine( + getEngineName()); + + CharSequence[] entries = new CharSequence[availableLangs.size()]; + CharSequence[] entryValues = new CharSequence[availableLangs.size()]; + + int selectedLanguageIndex = -1; + for (int i = 0; i < availableLangs.size(); i++) { + String[] langCountryVariant = availableLangs.get(i).split("-"); + Locale loc = null; + if (langCountryVariant.length == 1){ + loc = new Locale(langCountryVariant[0]); + } else if (langCountryVariant.length == 2){ + loc = new Locale(langCountryVariant[0], langCountryVariant[1]); + } else if (langCountryVariant.length == 3){ + loc = new Locale(langCountryVariant[0], langCountryVariant[1], + langCountryVariant[2]); + } + if (loc != null){ + entries[i] = loc.getDisplayName(); + entryValues[i] = availableLangs.get(i); + if (entryValues[i].equals(currentLocale)) { + selectedLanguageIndex = i; + } + } + } + + mLocalePreference.setEntries(entries); + mLocalePreference.setEntryValues(entryValues); + if (selectedLanguageIndex > -1) { + mLocalePreference.setValueIndex(selectedLanguageIndex); + } else { + mLocalePreference.setValueIndex(0); + mEnginesHelper.updateLocalePrefForEngine(getEngineName(), + availableLangs.get(0)); + } + } + + /** + * Ask the current default engine to launch the matching INSTALL_TTS_DATA activity + * so the required TTS files are properly installed. + */ + private void installVoiceData() { + if (TextUtils.isEmpty(getEngineName())) return; + Intent intent = new Intent(TextToSpeech.Engine.ACTION_INSTALL_TTS_DATA); + intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + intent.setPackage(getEngineName()); + try { + Log.v(TAG, "Installing voice data: " + intent.toUri(0)); + startActivity(intent); + } catch (ActivityNotFoundException ex) { + Log.e(TAG, "Failed to install TTS data, no acitivty found for " + intent + ")"); + } + } + + @Override + public boolean onPreferenceClick(Preference preference) { + if (preference == mInstallVoicesPreference) { + installVoiceData(); + return true; + } else if (preference == mEngineSettingsPreference) { + startActivity(mEngineSettingsIntent); + return true; + } + + return false; + } + + @Override + public boolean onPreferenceChange(Preference preference, Object newValue) { + if (preference == mLocalePreference) { + mEnginesHelper.updateLocalePrefForEngine(getEngineName(), (String) newValue); + return true; + } + + return false; + } + + private String getEngineName() { + return getArguments().getString(TtsEnginePreference.FRAGMENT_ARGS_NAME); + } + + private String getEngineLabel() { + return getArguments().getString(TtsEnginePreference.FRAGMENT_ARGS_LABEL); + } + +} |